diff --git a/.env b/.env index 3182c162266..fe9b06d4ff1 100644 --- a/.env +++ b/.env @@ -10,10 +10,10 @@ TIMEZONE="Melbourne" DEFAULT_COUNTRY_CODE="AU" # Locale for translation. -LOCALE="en" +LOCALE="en_AU" # For multilingual - ENV doesn't have array so pass it as string with commas -AVAILABLE_LOCALES="en,es" +AVAILABLE_LOCALES="en_AU,es" # Spree zone. CHECKOUT_ZONE="Australia" @@ -42,14 +42,6 @@ SMTP_PASSWORD="f00d" # Javascript error reporting via Bugsnag. # BUGSNAG_JS_KEY="" -# SingleSignOn login for Discourse -# -# DISCOURSE_SSO_SECRET should be a random string. It must be the same as provided to your Discourse instance. -# DISCOURSE_SSO_SECRET="" -# -# DISCOURSE_URL must be the URL of your Discourse instance. -# DISCOURSE_URL="https://noticeboard.openfoodnetwork.org.au" - # see="https://developers.google.com/maps/documentation/javascript/get-api-key # GOOGLE_MAPS_API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # see https://developers.google.com/maps/documentation/javascript/localization#Region diff --git a/.env.development b/.env.development index 1605f8ffbab..68640acf212 100644 --- a/.env.development +++ b/.env.development @@ -5,6 +5,11 @@ # # cp .env.development .env.local +# Locale for translation. Using a locale other than `en` tests the +# successful fallback to `en`. You will also see up-to-date text used +# in production +LOCALE="en_AU" + VERBOSE_QUERY_LOGS=true SECRET_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" diff --git a/.env.test b/.env.test index 09881648aa9..c0097a0416f 100644 --- a/.env.test +++ b/.env.test @@ -1,6 +1,9 @@ # ENV vars for the test environment # Override locally with `.env.test.local` +# Locale for translation. +LOCALE="en_TEST" + OFN_REDIS_JOBS_URL="redis://localhost:6379/2" SECRET_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" diff --git a/.github/ISSUE_TEMPLATE/release.md b/.github/ISSUE_TEMPLATE/release.md index caf9fb39b87..7ff900d243f 100644 --- a/.github/ISSUE_TEMPLATE/release.md +++ b/.github/ISSUE_TEMPLATE/release.md @@ -45,7 +45,7 @@ The full process is described at https://github.com/openfoodfoundation/openfoodn [Ready To Go]: https://github.com/orgs/openfoodfoundation/projects/8?filterQuery=status%3A%22Ready+to+go+%F0%9F%9A%80%22 [Transifex pull request]: https://github.com/openfoodfoundation/openfoodnetwork/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+head%3Atransifex -[Draft new release]: https://github.com/openfoodfoundation/openfoodnetwork/releases/new?tag=v&title=v+Code+Name&body=Congrats%0A%0ADescription%0A%0A +[Draft new release]: https://github.com/openfoodfoundation/openfoodnetwork/releases/new?title=v+Code+Name&body=Congrats%0A%0ADescription%0A%0A [releases]: https://github.com/openfoodfoundation/openfoodnetwork/releases [#instance-managers]: https://app.slack.com/client/T02G54U79/CG7NJ966B [#testing]: https://openfoodnetwork.slack.com/app_redirect?channel=C02TZ6X00 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 846f781c71d..66f7d5a3ccd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -55,6 +55,7 @@ jobs: with: bundler-cache: true # runs 'bundle install' and caches installed gems automatically + # JS is required in order for webpacker to compile, in order to render templates containing image urls - uses: actions/setup-node@v3 with: node-version-file: .node-version @@ -64,8 +65,7 @@ jobs: - name: Set up database run: | - bundle exec rake db:create - bundle exec rake db:schema:load + bin/rake db:create db:schema:load - name: Run tests env: @@ -83,7 +83,7 @@ jobs: KNAPSACK_PRO_TEST_FILE_PATTERN: "{spec/controllers/**/*_spec.rb}" run: | git show --no-patch # the commit being tested (which is often a merge due to actions/checkout@v3) - bundle exec rake knapsack_pro:rspec + bin/rake knapsack_pro:rspec models: runs-on: ubuntu-22.04 @@ -106,10 +106,10 @@ jobs: # [n] - where the n is a number of parallel jobs you want to run your tests on. # Use a higher number if you have slow tests to split them between more parallel jobs. # Remember to update the value of the `ci_node_index` below to (0..n-1). - ci_node_total: [5] + ci_node_total: [4] # Indexes for parallel jobs (starting from zero). # E.g. use [0, 1] for 2 parallel jobs, [0, 1, 2] for 3 parallel jobs, etc. - ci_node_index: [0, 1, 2, 3, 4] + ci_node_index: [0, 1, 2, 3] steps: - uses: actions/checkout@v3 @@ -123,20 +123,11 @@ jobs: with: bundler-cache: true # runs 'bundle install' and caches installed gems automatically - - uses: actions/setup-node@v3 - with: - node-version-file: .node-version - - - name: Install JS dependencies - run: yarn install --frozen-lockfile - - name: Set up database run: | - bundle exec rake db:create - bundle exec rake db:schema:load + bin/rake db:create db:schema:load - name: Run tests - env: KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: 09476e2ce491c12083df62768667c674 KNAPSACK_PRO_CI_NODE_TOTAL: ${{ matrix.ci_node_total }} @@ -150,9 +141,8 @@ jobs: # https://knapsackpro.com/faq/question/how-to-split-slow-rspec-test-files-by-test-examples-by-individual-it #KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES: true KNAPSACK_PRO_TEST_FILE_PATTERN: "{spec/models/**/*_spec.rb}" - run: | - bundle exec rake knapsack_pro:rspec + bin/rake knapsack_pro:rspec system_admin: runs-on: ubuntu-22.04 @@ -175,10 +165,10 @@ jobs: # [n] - where the n is a number of parallel jobs you want to run your tests on. # Use a higher number if you have slow tests to split them between more parallel jobs. # Remember to update the value of the `ci_node_index` below to (0..n-1). - ci_node_total: [13] + ci_node_total: [14] # Indexes for parallel jobs (starting from zero). # E.g. use [0, 1] for 2 parallel jobs, [0, 1, 2] for 3 parallel jobs, etc. - ci_node_index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + ci_node_index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] steps: - uses: actions/checkout@v3 @@ -201,8 +191,7 @@ jobs: - name: Set up database run: | - bundle exec rake db:create - bundle exec rake db:schema:load + bin/rake db:create db:schema:load - name: Run tests @@ -221,7 +210,7 @@ jobs: KNAPSACK_PRO_TEST_FILE_PATTERN: "{spec/system/admin/**/*_spec.rb}" run: | - bundle exec rake knapsack_pro:queue:rspec + bin/rake knapsack_pro:queue:rspec - name: Archive failed tests screenshots if: failure() @@ -279,8 +268,7 @@ jobs: - name: Set up database run: | - bundle exec rake db:create - bundle exec rake db:schema:load + bin/rake db:create db:schema:load - name: Run tests @@ -299,7 +287,7 @@ jobs: KNAPSACK_PRO_TEST_FILE_PATTERN: "{spec/system/consumer/**/*_spec.rb}" run: | - bundle exec rake knapsack_pro:queue:rspec + bin/rake knapsack_pro:queue:rspec - name: Archive failed tests screenshots if: failure() @@ -348,6 +336,7 @@ jobs: with: bundler-cache: true # runs 'bundle install' and caches installed gems automatically + # JS is required in order for webpacker to compile, in order to render templates linking to mail.css - uses: actions/setup-node@v3 with: node-version-file: .node-version @@ -357,8 +346,7 @@ jobs: - name: Set up database run: | - bundle exec rake db:create - bundle exec rake db:schema:load + bin/rake db:create db:schema:load - name: Run tests @@ -377,7 +365,7 @@ jobs: KNAPSACK_PRO_TEST_FILE_PATTERN: "{spec/lib/**/*_spec.rb,spec/migrations/**/*_spec.rb,spec/serializers/**/*_spec.rb,engines/**/*_spec.rb}" run: | - bundle exec rake knapsack_pro:rspec + bin/rake knapsack_pro:rspec - name: Archive failed tests screenshots if: failure() @@ -426,6 +414,7 @@ jobs: with: bundler-cache: true # runs 'bundle install' and caches installed gems automatically + # JS is required in order for webpacker to compile, in order to render templates linking to mail.css - uses: actions/setup-node@v3 with: node-version-file: .node-version @@ -435,11 +424,9 @@ jobs: - name: Set up database run: | - bundle exec rake db:create - bundle exec rake db:schema:load + bin/rake db:create db:schema:load - name: Run tests - env: KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: e3b8800198d2d89b70c7edbdd85f8fd8 KNAPSACK_PRO_CI_NODE_TOTAL: ${{ matrix.ci_node_total }} @@ -453,10 +440,8 @@ jobs: # https://knapsackpro.com/faq/question/how-to-split-slow-rspec-test-files-by-test-examples-by-individual-it #KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES: true KNAPSACK_PRO_TEST_FILE_EXCLUDE_PATTERN: "{engines/**/*_spec.rb,spec/models/**/*_spec.rb,spec/controllers/**/*_spec.rb,spec/serializers/**/*_spec.rb,spec/lib/**/*_spec.rb,spec/migrations/**/*_spec.rb,spec/system/**/*_spec.rb}" - - run: | - bundle exec rake knapsack_pro:rspec + bin/rake knapsack_pro:rspec non_knapsack_jest_karma: runs-on: ubuntu-22.04 @@ -476,11 +461,7 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Setup redis - uses: supercharge/redis-github-action@1.4.0 - with: - redis-version: 6 - + # Rails is required for the Karma rake script - name: Set up Ruby uses: ruby/setup-ruby@v1 with: @@ -493,12 +474,8 @@ jobs: - name: Install JS dependencies run: yarn install --frozen-lockfile - - name: Set up database - run: | - bundle exec rake db:create - bundle exec rake db:schema:load - name: Run JS tests - run: bundle exec rake karma:run + run: bin/rake karma:run - name: Run jest tests run: yarn jest diff --git a/.rspec b/.rspec new file mode 100644 index 00000000000..eb81da86cfe --- /dev/null +++ b/.rspec @@ -0,0 +1 @@ +--require base_spec_helper diff --git a/.rubocop.yml b/.rubocop.yml index 937a2acf170..93d9f9bd819 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -5,8 +5,12 @@ # The configuration is split into three files. Look into those files for more details. # require: + - rubocop-capybara + - rubocop-factory_bot - rubocop-rails - rubocop-rspec + - rubocop-rspec_rails + inherit_from: # The automatically generated todo list to ignore all current violations. diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 8ed82cc4a71..7d398188f31 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,15 +1,39 @@ # This configuration was generated by # `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 1400 --no-auto-gen-timestamp` -# using RuboCop version 1.62.1. +# using RuboCop version 1.64.1. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. +# Offense count: 1 +# This cop supports safe autocorrection (--autocorrect). +# Configuration parameters: EmptyLineBetweenMethodDefs, EmptyLineBetweenClassDefs, EmptyLineBetweenModuleDefs, DefLikeMacros, AllowAdjacentOneLineDefs, NumberOfEmptyLines. +Layout/EmptyLineBetweenDefs: + Exclude: + - 'app/services/products_renderer.rb' + +# Offense count: 1 +# This cop supports safe autocorrection (--autocorrect). +Layout/EmptyLines: + Exclude: + - 'app/services/products_renderer.rb' + +# Offense count: 6 +# This cop supports safe autocorrection (--autocorrect). +# Configuration parameters: EnforcedStyle, IndentationWidth. +# SupportedStyles: aligned, indented, indented_relative_to_receiver +Layout/MultilineMethodCallIndentation: + Exclude: + - 'app/services/products_renderer.rb' + # Offense count: 2 -Lint/DuplicateMethods: +# This cop supports safe autocorrection (--autocorrect). +# Configuration parameters: EnforcedStyle, IndentationWidth. +# SupportedStyles: aligned, indented +Layout/MultilineOperationIndentation: Exclude: - - 'lib/discourse/single_sign_on.rb' + - 'app/services/products_renderer.rb' # Offense count: 16 # Configuration parameters: AllowComments, AllowEmptyLambdas. @@ -27,11 +51,10 @@ Lint/EmptyBlock: - 'spec/jobs/subscription_placement_job_spec.rb' - 'spec/models/product_import/entry_validator_spec.rb' -# Offense count: 6 +# Offense count: 4 # Configuration parameters: AllowComments. Lint/EmptyClass: Exclude: - - 'spec/controllers/spree/admin/base_controller_spec.rb' - 'spec/lib/reports/report_loader_spec.rb' # Offense count: 1 @@ -85,7 +108,7 @@ Lint/UselessMethodDefinition: Exclude: - 'app/models/spree/gateway.rb' -# Offense count: 26 +# Offense count: 24 # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max. Metrics/AbcSize: Exclude: @@ -104,11 +127,9 @@ Metrics/AbcSize: - 'app/models/spree/order/checkout.rb' - 'app/models/spree/preferences/preferable_class_methods.rb' - 'app/models/spree/return_authorization.rb' - - 'lib/discourse/single_sign_on.rb' - 'lib/open_food_network/order_cycle_form_applicator.rb' - 'lib/open_food_network/order_cycle_permissions.rb' - 'lib/spree/core/controller_helpers/order.rb' - - 'lib/tasks/enterprises.rake' - 'spec/services/orders/checkout_restart_service_spec.rb' # Offense count: 9 @@ -129,7 +150,7 @@ Metrics/BlockNesting: Exclude: - 'app/models/spree/payment/processing.rb' -# Offense count: 46 +# Offense count: 47 # Configuration parameters: CountComments, Max, CountAsOne. Metrics/ClassLength: Exclude: @@ -164,6 +185,7 @@ Metrics/ClassLength: - 'app/models/spree/user.rb' - 'app/models/spree/variant.rb' - 'app/models/spree/zone.rb' + - 'app/reflexes/admin/orders_reflex.rb' - 'app/reflexes/products_reflex.rb' - 'app/serializers/api/cached_enterprise_serializer.rb' - 'app/serializers/api/enterprise_shopfront_serializer.rb' @@ -180,7 +202,7 @@ Metrics/ClassLength: - 'lib/reporting/reports/enterprise_fee_summary/scope.rb' - 'lib/reporting/reports/xero_invoices/base.rb' -# Offense count: 34 +# Offense count: 32 # Configuration parameters: AllowedMethods, AllowedPatterns, Max. Metrics/CyclomaticComplexity: Exclude: @@ -190,7 +212,6 @@ Metrics/CyclomaticComplexity: - 'app/helpers/checkout_helper.rb' - 'app/helpers/order_cycles_helper.rb' - 'app/helpers/spree/admin/navigation_helper.rb' - - 'app/models/enterprise.rb' - 'app/models/enterprise_relationship.rb' - 'app/models/product_import/entry_validator.rb' - 'app/models/spree/ability.rb' @@ -204,7 +225,6 @@ Metrics/CyclomaticComplexity: - 'app/models/spree/tax_rate.rb' - 'app/models/spree/variant.rb' - 'app/models/spree/zone.rb' - - 'lib/discourse/single_sign_on.rb' - 'lib/open_food_network/enterprise_issue_validator.rb' - 'lib/reporting/reports/xero_invoices/base.rb' - 'lib/spree/core/controller_helpers/order.rb' @@ -212,7 +232,7 @@ Metrics/CyclomaticComplexity: - 'lib/spree/localized_number.rb' - 'spec/models/product_importer_spec.rb' -# Offense count: 25 +# Offense count: 24 # Configuration parameters: CountComments, Max, CountAsOne, AllowedMethods, AllowedPatterns. Metrics/MethodLength: Exclude: @@ -226,7 +246,6 @@ Metrics/MethodLength: - 'app/models/spree/order/checkout.rb' - 'app/models/spree/payment/processing.rb' - 'app/models/spree/preferences/preferable_class_methods.rb' - - 'lib/discourse/single_sign_on.rb' - 'lib/open_food_network/order_cycle_form_applicator.rb' - 'lib/open_food_network/order_cycle_permissions.rb' - 'lib/reporting/reports/enterprise_fee_summary/scope.rb' @@ -398,7 +417,6 @@ RSpecRails/HaveHttpStatus: - 'spec/controllers/user_registrations_controller_spec.rb' - 'spec/requests/admin/images_spec.rb' - 'spec/requests/api/routes_spec.rb' - - 'spec/requests/checkout/failed_checkout_spec.rb' - 'spec/requests/checkout/stripe_sca_spec.rb' - 'spec/requests/home_controller_spec.rb' - 'spec/requests/omniauth_callbacks_controller_spec.rb' @@ -414,7 +432,7 @@ RSpecRails/HttpStatus: - 'spec/controllers/spree/admin/products_controller_spec.rb' - 'spec/requests/api/orders_spec.rb' -# Offense count: 146 +# Offense count: 144 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: Inferences. RSpecRails/InferredSpecType: @@ -518,7 +536,6 @@ RSpecRails/InferredSpecType: - 'spec/helpers/navigation_helper_spec.rb' - 'spec/helpers/order_cycles_helper_spec.rb' - 'spec/helpers/serializer_helper_spec.rb' - - 'spec/helpers/shared_helper_spec.rb' - 'spec/helpers/shop_helper_spec.rb' - 'spec/helpers/spree/admin/base_helper_spec.rb' - 'spec/helpers/spree/admin/general_settings_helper_spec.rb' @@ -552,7 +569,6 @@ RSpecRails/InferredSpecType: - 'spec/requests/api/routes_spec.rb' - 'spec/requests/api/v1/customers_spec.rb' - 'spec/requests/api_docs_spec.rb' - - 'spec/requests/checkout/failed_checkout_spec.rb' - 'spec/requests/checkout/paypal_spec.rb' - 'spec/requests/checkout/routes_spec.rb' - 'spec/requests/checkout/stripe_sca_spec.rb' @@ -565,17 +581,6 @@ RSpecRails/InferredSpecType: - 'spec/requests/voucher_adjustments_spec.rb' - 'spec/routing/stripe_spec.rb' -# Offense count: 11 -# Configuration parameters: Include. -# Include: app/models/**/*.rb -Rails/HasManyOrHasOneDependent: - Exclude: - - 'app/models/enterprise.rb' - - 'app/models/spree/address.rb' - - 'app/models/spree/stock_item.rb' - - 'app/models/spree/tax_rate.rb' - - 'app/models/spree/variant.rb' - # Offense count: 22 # Configuration parameters: IgnoreScopes, Include. # Include: app/models/**/*.rb @@ -660,27 +665,6 @@ Rails/RedundantActiveRecordAllMethod: - 'app/models/spree/variant.rb' - 'spec/system/admin/product_import_spec.rb' -# Offense count: 20 -# This cop supports unsafe autocorrection (--autocorrect-all). -Rails/RedundantPresenceValidationOnBelongsTo: - Exclude: - - 'app/models/enterprise_fee.rb' - - 'app/models/exchange.rb' - - 'app/models/inventory_item.rb' - - 'app/models/order_cycle.rb' - - 'app/models/spree/address.rb' - - 'app/models/spree/line_item.rb' - - 'app/models/spree/order.rb' - - 'app/models/spree/product_property.rb' - - 'app/models/spree/return_authorization.rb' - - 'app/models/spree/state.rb' - - 'app/models/spree/stock_item.rb' - - 'app/models/spree/stock_movement.rb' - - 'app/models/spree/tax_rate.rb' - - 'app/models/subscription_line_item.rb' - - 'app/models/tag_rule.rb' - - 'app/models/variant_override.rb' - # Offense count: 1 # This cop supports unsafe autocorrection (--autocorrect-all). Rails/RelativeDateConstant: @@ -762,17 +746,6 @@ Rails/UnknownEnv: Exclude: - 'app/models/spree/app_configuration.rb' -# Offense count: 7 -# Configuration parameters: Severity. -Rails/UnusedRenderContent: - Exclude: - - 'app/controllers/admin/bulk_line_items_controller.rb' - - 'app/controllers/admin/tag_rules_controller.rb' - - 'app/controllers/api/v0/enterprise_fees_controller.rb' - - 'app/controllers/api/v0/products_controller.rb' - - 'app/controllers/api/v0/taxons_controller.rb' - - 'app/controllers/api/v0/variants_controller.rb' - # Offense count: 1 Security/Open: Exclude: @@ -797,7 +770,7 @@ Style/CaseEquality: Exclude: - 'spec/models/spree/payment_spec.rb' -# Offense count: 25 +# Offense count: 23 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle. # SupportedStyles: nested, compact @@ -824,10 +797,9 @@ Style/ClassAndModuleChildren: - 'app/serializers/api/taxon_serializer.rb' - 'app/serializers/api/variant_serializer.rb' - 'lib/open_food_network/locking.rb' - - 'spec/controllers/spree/admin/base_controller_spec.rb' - 'spec/models/spree/payment_method_spec.rb' -# Offense count: 1 +# Offense count: 2 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle. # SupportedStyles: always, always_true, never @@ -877,12 +849,6 @@ Style/HashEachMethods: - 'spec/models/product_importer_spec.rb' - 'spec/support/cancan_helper.rb' -# Offense count: 1 -# Configuration parameters: MinBranchesCount. -Style/HashLikeCase: - Exclude: - - 'app/models/enterprise.rb' - # Offense count: 4 # This cop supports unsafe autocorrection (--autocorrect-all). Style/MapToHash: @@ -971,19 +937,6 @@ Style/RedundantInitialize: Exclude: - 'spec/models/spree/gateway_spec.rb' -# Offense count: 2 -# This cop supports unsafe autocorrection (--autocorrect-all). -Style/RedundantInterpolation: - Exclude: - - 'lib/tasks/karma.rake' - - 'spec/base_spec_helper.rb' - -# Offense count: 8 -# This cop supports safe autocorrection (--autocorrect). -Style/RedundantLineContinuation: - Exclude: - - 'lib/reporting/reports/enterprise_fee_summary/scope.rb' - # Offense count: 19 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: AllowedMethods, AllowedPatterns. @@ -1026,36 +979,10 @@ Style/Send: - 'spec/services/variant_units/option_value_namer_spec.rb' - 'spec/support/localized_number_helper.rb' -# Offense count: 4 +# Offense count: 3 # This cop supports unsafe autocorrection (--autocorrect-all). Style/SlicingWithRange: Exclude: - 'app/helpers/spree/admin/navigation_helper.rb' - 'app/services/embedded_page_service.rb' - 'engines/order_management/app/services/order_management/subscriptions/validator.rb' - - 'lib/discourse/single_sign_on.rb' - -# Offense count: 25 -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: Mode. -Style/StringConcatenation: - Exclude: - - 'app/controllers/admin/stripe_connect_settings_controller.rb' - - 'app/helpers/discourse_helper.rb' - - 'app/helpers/enterprises_helper.rb' - - 'app/helpers/spree/admin/base_helper.rb' - - 'app/mailers/spree/user_mailer.rb' - - 'app/models/enterprise.rb' - - 'app/models/spree/credit_card.rb' - - 'app/models/spree/payment_method.rb' - - 'app/serializers/api/cached_enterprise_serializer.rb' - - 'app/serializers/api/enterprise_shopfront_list_serializer.rb' - - 'app/services/embedded_page_service.rb' - - 'app/services/products_renderer.rb' - - 'lib/spree/api/controller_setup.rb' - - 'lib/spree/core/environment_extension.rb' - - 'spec/models/spree/line_item_spec.rb' - - 'spec/models/spree/product_spec.rb' - - 'spec/services/embedded_page_service_spec.rb' - - 'spec/support/features/datepicker_helper.rb' - - 'spec/system/admin/products_spec.rb' diff --git a/Gemfile b/Gemfile index d4eea771b03..94f0e62398e 100644 --- a/Gemfile +++ b/Gemfile @@ -19,7 +19,6 @@ gem 'angular-rails-templates', '>= 0.3.0' gem 'awesome_nested_set' gem 'ransack', '~> 4.1.0' gem 'responders' -gem 'rexml' gem 'webpacker', '~> 5' gem 'i18n' @@ -103,8 +102,10 @@ gem 'redis' gem 'sidekiq' gem 'sidekiq-scheduler' -gem "cable_ready", "5.0.1" -gem "stimulus_reflex", "3.5.0.rc3" +gem "cable_ready" +gem "stimulus_reflex" + +gem "turbo-rails" gem 'combine_pdf' gem 'wicked_pdf' @@ -164,7 +165,7 @@ group :test, :development do gem 'rspec-sql' gem 'rswag' gem 'shoulda-matchers' - gem 'stimulus_reflex_testing' + gem 'stimulus_reflex_testing', github: "podia/stimulus_reflex_testing", branch: :main gem 'timecop' end diff --git a/Gemfile.lock b/Gemfile.lock index e272c63b0c5..69516dca6d0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,6 +17,14 @@ GIT sass-rails thor (>= 0.14) +GIT + remote: https://github.com/podia/stimulus_reflex_testing.git + revision: abac2ee34de347c589795b4d1a8e83e0baafb201 + branch: main + specs: + stimulus_reflex_testing (0.3.1) + stimulus_reflex (>= 3.3.0) + PATH remote: engines/catalog specs: @@ -165,17 +173,17 @@ GEM awesome_nested_set (3.6.0) activerecord (>= 4.0.0, < 7.2) aws-eventstream (1.3.0) - aws-partitions (1.914.0) - aws-sdk-core (3.192.0) + aws-partitions (1.929.0) + aws-sdk-core (3.196.1) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.79.0) - aws-sdk-core (~> 3, >= 3.191.0) + aws-sdk-kms (1.81.0) + aws-sdk-core (~> 3, >= 3.193.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.147.0) - aws-sdk-core (~> 3, >= 3.192.0) + aws-sdk-s3 (1.151.0) + aws-sdk-core (~> 3, >= 3.194.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.8) aws-sigv4 (1.8.0) @@ -194,10 +202,11 @@ GEM bullet (7.1.6) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) - cable_ready (5.0.1) + cable_ready (5.0.5) actionpack (>= 5.2) actionview (>= 5.2) activesupport (>= 5.2) + observer (~> 0.1) railties (>= 5.2) thread-local (>= 1.1.0) cancancan (1.15.0) @@ -230,14 +239,15 @@ GEM combine_pdf (1.0.26) matrix ruby-rc4 (>= 0.1.5) - concurrent-ruby (1.2.3) + concurrent-ruby (1.3.1) connection_pool (2.4.1) crack (1.0.0) bigdecimal rexml crass (1.0.6) - css_parser (1.16.0) + css_parser (1.17.1) addressable + csv (3.3.0) cuprite (0.15) capybara (~> 3.0) ferrum (~> 0.14.0) @@ -262,14 +272,14 @@ GEM warden (~> 1.2.3) devise-encryptable (0.2.0) devise (>= 2.1.0) - devise-i18n (1.12.0) + devise-i18n (1.12.1) devise (>= 4.9.0) devise-token_authenticatable (1.1.0) devise (>= 4.0.0, < 5.0.0) diff-lcs (1.5.1) digest (3.1.1) docile (1.4.0) - dotenv (3.1.0) + dotenv (3.1.2) drb (2.2.0) ruby2_keywords email_validator (2.2.4) @@ -297,16 +307,17 @@ GEM websocket-driver (>= 0.6, < 0.8) ffaker (2.23.0) ffi (1.16.3) - flipper (0.26.2) + flipper (1.3.0) concurrent-ruby (< 2) - flipper-active_record (0.26.2) + flipper-active_record (1.3.0) activerecord (>= 4.2, < 8) - flipper (~> 0.26.2) - flipper-ui (0.26.2) + flipper (~> 1.3.0) + flipper-ui (1.3.0) erubi (>= 1.0.0, < 2.0.0) - flipper (~> 0.26.2) - rack (>= 1.4, < 3) - rack-protection (>= 1.5.3, <= 4.0.0) + flipper (~> 1.3.0) + rack (>= 1.4, < 4) + rack-protection (>= 1.5.3, < 5.0.0) + rack-session (>= 1.0.2, < 3.0.0) sanitize (< 7) fog-aws (2.0.1) fog-core (~> 1.38) @@ -331,7 +342,9 @@ GEM fuubar (2.5.1) rspec-core (~> 3.0) ruby-progressbar (~> 1.4) - geocoder (1.8.2) + geocoder (1.8.3) + base64 (>= 0.1.0) + csv (>= 3.0.0) globalid (1.2.1) activesupport (>= 6.1) gmaps4rails (2.1.2) @@ -347,7 +360,7 @@ GEM hashie (5.0.0) highline (2.0.3) htmlentities (4.3.4) - i18n (1.14.4) + i18n (1.14.5) concurrent-ruby (~> 1.0) i18n-js (3.9.2) i18n (>= 0.6.6) @@ -395,7 +408,7 @@ GEM activesupport (>= 4.2) jwt (2.8.1) base64 - knapsack_pro (6.0.4) + knapsack_pro (7.4.0) rake language_server-protocol (3.17.0.3) launchy (3.0.0) @@ -417,7 +430,7 @@ GEM net-smtp marcel (1.0.2) matrix (0.4.2) - method_source (1.0.0) + method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) mime-types-data (3.2023.1205) @@ -427,7 +440,7 @@ GEM mini_magick (4.11.0) mini_mime (1.1.5) mini_portile2 (2.8.6) - minitest (5.22.3) + minitest (5.23.1) monetize (1.13.0) money (~> 6.12) money (6.16.0) @@ -447,22 +460,25 @@ GEM timeout net-smtp (0.5.0) net-protocol - newrelic_rpm (9.8.0) + newrelic_rpm (9.9.0) nio4r (2.7.0) - nokogiri (1.16.4) + nokogiri (1.16.5) mini_portile2 (~> 2.8.2) racc (~> 1.4) + nokogiri-html5-inference (0.3.0) + nokogiri (~> 1.14) oauth2 (1.4.11) faraday (>= 0.17.3, < 3.0) jwt (>= 1.0, < 3.0) multi_json (~> 1.3) multi_xml (~> 0.5) rack (>= 1.2, < 4) + observer (0.1.2) omniauth (2.1.2) hashie (>= 3.4.6) rack (>= 2.2.3) rack-protection - omniauth-rails_csrf_protection (1.0.1) + omniauth-rails_csrf_protection (1.0.2) actionpack (>= 4.2) omniauth (~> 2.0) omniauth_openid_connect (0.7.1) @@ -490,7 +506,7 @@ GEM parallel (1.24.0) paranoia (2.6.3) activerecord (>= 5.1, < 7.2) - parser (3.3.0.5) + parser (3.3.2.0) ast (~> 2.4.1) racc paypal-sdk-core (0.3.4) @@ -511,14 +527,14 @@ GEM method_source (~> 1.0) psych (5.1.2) stringio - public_suffix (5.0.4) + public_suffix (5.0.5) puma (6.4.2) nio4r (~> 2.0) query_count (1.1.1) activerecord (>= 4.2) railties (>= 4.2) raabro (1.4.0) - racc (1.7.3) + racc (1.8.0) rack (2.2.9) rack-mini-profiler (2.3.4) rack (>= 1.2.0) @@ -602,9 +618,9 @@ GEM redcarpet (3.6.0) redis (5.2.0) redis-client (>= 0.22.0) - redis-client (0.22.0) + redis-client (0.22.1) connection_pool - regexp_parser (2.9.0) + regexp_parser (2.9.2) reline (0.5.0) io-console (~> 0.5) request_store (1.5.1) @@ -612,11 +628,12 @@ GEM responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) - rexml (3.2.6) - roadie (5.2.0) + rexml (3.2.8) + strscan (>= 3.0.9) + roadie (5.2.1) css_parser (~> 1.4) nokogiri (~> 1.15) - roadie-rails (3.1.0) + roadie-rails (3.2.0) railties (>= 5.1, < 8.0) roadie (~> 5.0) rodf (1.2.0) @@ -666,7 +683,7 @@ GEM rswag-ui (2.13.0) actionpack (>= 3.1, < 7.2) railties (>= 3.1, < 7.2) - rubocop (1.63.2) + rubocop (1.64.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) @@ -677,8 +694,8 @@ GEM rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.31.2) - parser (>= 3.3.0.4) + rubocop-ast (1.31.3) + parser (>= 3.3.1.0) rubocop-capybara (2.20.0) rubocop (~> 1.41) rubocop-factory_bot (2.25.1) @@ -688,12 +705,12 @@ GEM rack (>= 1.1) rubocop (>= 1.33.0, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rspec (2.29.1) + rubocop-rspec (2.29.2) rubocop (~> 1.40) rubocop-capybara (~> 2.17) rubocop-factory_bot (~> 2.22) rubocop-rspec_rails (~> 2.28) - rubocop-rspec_rails (2.28.2) + rubocop-rspec_rails (2.28.3) rubocop (~> 1.40) ruby-graphviz (1.2.5) rexml @@ -705,7 +722,7 @@ GEM rubyzip (2.3.2) rufus-scheduler (3.8.2) fugit (~> 1.1, >= 1.1.6) - sanitize (6.0.2) + sanitize (6.1.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) sass (3.4.25) @@ -719,7 +736,7 @@ GEM semantic_range (3.0.0) shoulda-matchers (6.2.0) activesupport (>= 5.2.0) - sidekiq (7.2.2) + sidekiq (7.2.4) concurrent-ruby (< 2) connection_pool (>= 2.3.0) rack (>= 2.2.4) @@ -737,7 +754,7 @@ GEM spreadsheet_architect (5.0.0) caxlsx (>= 3.3.0, < 4) rodf (>= 1.0.0, < 2) - spring (4.2.0) + spring (4.2.1) spring-commands-rspec (1.0.4) spring (>= 0.9.1) spring-commands-rubocop (0.4.0) @@ -756,21 +773,21 @@ GEM state_machines-activerecord (0.9.0) activerecord (>= 6.0) state_machines-activemodel (>= 0.9.0) - stimulus_reflex (3.5.0.rc3) + stimulus_reflex (3.5.1) actioncable (>= 5.2, < 8) actionpack (>= 5.2, < 8) actionview (>= 5.2, < 8) activesupport (>= 5.2, < 8) cable_ready (~> 5.0) nokogiri (~> 1.0) + nokogiri-html5-inference (~> 0.3) rack (>= 2, < 4) railties (>= 5.2, < 8) redis (>= 4.0, < 6.0) - stimulus_reflex_testing (0.3.0) - stimulus_reflex (>= 3.3.0) stringex (2.8.6) stringio (3.1.0) stripe (11.1.0) + strscan (3.1.0) swd (2.0.3) activesupport (>= 3) attr_required (>= 0.0.5) @@ -783,6 +800,10 @@ GEM timecop (0.9.8) timeout (0.4.1) ttfunk (1.7.0) + turbo-rails (2.0.5) + actionpack (>= 6.0.0) + activejob (>= 6.0.0) + railties (>= 6.0.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.5.0) @@ -797,7 +818,7 @@ GEM validates_lengths_from_database (0.8.0) activerecord (>= 4) vcr (6.2.0) - view_component (3.12.0) + view_component (3.12.1) activesupport (>= 5.2.0, < 8.0) concurrent-ruby (~> 1.0) method_source (~> 1.0) @@ -818,7 +839,7 @@ GEM activesupport faraday (~> 2.0) faraday-follow_redirects - webmock (3.23.0) + webmock (3.23.1) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -835,11 +856,11 @@ GEM chronic (>= 0.6.3) wicked_pdf (2.6.3) activesupport - wkhtmltopdf-binary (0.12.6.6) + wkhtmltopdf-binary (0.12.6.7) xml-simple (1.1.8) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.13) + zeitwerk (2.6.15) PLATFORMS ruby @@ -865,7 +886,7 @@ DEPENDENCIES bootsnap bugsnag bullet - cable_ready (= 5.0.1) + cable_ready cancancan (~> 1.15.0) capybara catalog! @@ -944,7 +965,6 @@ DEPENDENCIES redcarpet redis responders - rexml roadie-rails roo rspec-rails (>= 3.5.2) @@ -967,11 +987,12 @@ DEPENDENCIES spring-commands-rspec spring-commands-rubocop state_machines-activerecord - stimulus_reflex (= 3.5.0.rc3) - stimulus_reflex_testing + stimulus_reflex + stimulus_reflex_testing! stringex (~> 2.8.5) stripe timecop + turbo-rails valid_email2 validates_lengths_from_database vcr diff --git a/app/assets/javascripts/admin/index_utils/services/columns.js.coffee b/app/assets/javascripts/admin/index_utils/services/columns.js.coffee index 2d7abfcab79..aeb1a3e3b61 100644 --- a/app/assets/javascripts/admin/index_utils/services/columns.js.coffee +++ b/app/assets/javascripts/admin/index_utils/services/columns.js.coffee @@ -31,7 +31,7 @@ angular.module("admin.indexUtils").factory 'Columns', ($rootScope, $http, $injec savePreferences: (action_name) => $http method: "PUT" - url: "/admin/column_preferences/bulk_update" + url: "/admin/column_preferences/bulk_update.json" data: action_name: action_name column_preferences: (preference for column_name, preference of @columns) diff --git a/app/assets/javascripts/darkswarm/controllers/registration/registration_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/registration/registration_controller.js.coffee index 5145c05ea12..7d38de19dac 100644 --- a/app/assets/javascripts/darkswarm/controllers/registration/registration_controller.js.coffee +++ b/app/assets/javascripts/darkswarm/controllers/registration/registration_controller.js.coffee @@ -42,8 +42,17 @@ angular.module('Darkswarm').controller "RegistrationCtrl", ($scope, Registration $scope.toggleAddressConfirmed = -> $scope.addressConfirmed = !$scope.addressConfirmed if $scope.addressConfirmed + $scope.setLatLongIfUsingOpenStreetMap() $scope.enterprise.address.latitude = $scope.latLong.latitude $scope.enterprise.address.longitude = $scope.latLong.longitude else $scope.enterprise.address.latitude = null $scope.enterprise.address.longitude = null + + # When OpenStreetMaps is enabled the latitude and longitude are calculated via a Stimulus + # controller, so they need to be read from data properties to be accessible here. + $scope.setLatLongIfUsingOpenStreetMap = -> + openStreetMap = document.getElementById("open-street-map") + if !$scope.latLong && openStreetMap && openStreetMap.dataset.latitude && openStreetMap.dataset.longitude + $scope.latLong = { latitude: openStreetMap.dataset.latitude, longitude: openStreetMap.dataset.longitude } + diff --git a/app/assets/javascripts/templates/admin/columns_dropdown.html.haml b/app/assets/javascripts/templates/admin/columns_dropdown.html.haml index 61f42974dbc..7895d7070eb 100644 --- a/app/assets/javascripts/templates/admin/columns_dropdown.html.haml +++ b/app/assets/javascripts/templates/admin/columns_dropdown.html.haml @@ -5,8 +5,9 @@ %div.menu{ 'ng-show' => "expanded" } .menu_items .menu_item{ "ng-repeat": "column in columns", "ng-click": "toggle(column);" } - %input.redesigned-input{ type: "checkbox", "ng-checked": "column.visible" } - {{ column.name }} + %input{ type: "checkbox", "ng-checked": "column.visible" } + %span + {{ column.name }} %hr %div.menu_item.text-center %input.fullwidth.orange{ type: "button", "ng-value": "saved() ? 'Saved': 'Saving'", "ng-show": "saved() || saving", "ng-disabled": "saved()" } diff --git a/app/components/help_modal_component.rb b/app/components/help_modal_component.rb index 297ff347650..fef42131aad 100644 --- a/app/components/help_modal_component.rb +++ b/app/components/help_modal_component.rb @@ -2,6 +2,6 @@ class HelpModalComponent < ModalComponent def initialize(id:, close_button: true) - super(id:, close_button:) + super end end diff --git a/app/components/multiple_checked_select_component/multiple_checked_select_component.html.haml b/app/components/multiple_checked_select_component/multiple_checked_select_component.html.haml index 8dedce27ca9..c9c0abebec9 100644 --- a/app/components/multiple_checked_select_component/multiple_checked_select_component.html.haml +++ b/app/components/multiple_checked_select_component/multiple_checked_select_component.html.haml @@ -9,5 +9,5 @@ %div.menu_items - @options.each do |option| %label.menu_item{ "data-multiple-checked-select-target": "option", "data-value": option[1], "data-label": option[0] } - %input.redesigned-input{ type: "checkbox", checked: @selected.include?(option[1]), name: "#{@name}[]", value: option[1] } - = option[0] + %input{ type: "checkbox", checked: @selected.include?(option[1]), name: "#{@name}[]", value: option[1] } + %span= option[0] diff --git a/app/components/searchable_dropdown_component.rb b/app/components/searchable_dropdown_component.rb new file mode 100644 index 00000000000..9a53155085b --- /dev/null +++ b/app/components/searchable_dropdown_component.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +class SearchableDropdownComponent < ViewComponent::Base + REMOVED_SEARCH_PLUGIN = { 'tom-select-options-value': '{ "plugins": [] }' }.freeze + MINIMUM_OPTIONS_FOR_SEARCH_FIELD = 11 # at least 11 options are required for the search field + + def initialize( + form:, + name:, + options:, + selected_option:, + placeholder_value:, + include_blank: false, + aria_label: '' + ) + @f = form + @name = name + @options = options + @selected_option = selected_option + @placeholder_value = placeholder_value + @include_blank = include_blank + @aria_label = aria_label + end + + private + + attr_reader :f, :name, :options, :selected_option, :placeholder_value, :include_blank, :aria_label + + def classes + "fullwidth #{remove_search_plugin? ? 'no-input' : ''}" + end + + def data + { + controller: "tom-select", + 'tom-select-placeholder-value': placeholder_value + }.merge(remove_search_plugin? ? REMOVED_SEARCH_PLUGIN : {}) + end + + def remove_search_plugin? + @remove_search_plugin ||= options.count < MINIMUM_OPTIONS_FOR_SEARCH_FIELD + end +end diff --git a/app/components/searchable_dropdown_component/searchable_dropdown_component.html.haml b/app/components/searchable_dropdown_component/searchable_dropdown_component.html.haml new file mode 100644 index 00000000000..10043eaa299 --- /dev/null +++ b/app/components/searchable_dropdown_component/searchable_dropdown_component.html.haml @@ -0,0 +1 @@ += f.select name, options_for_select(options, selected_option), { include_blank: }, class: classes, data:, 'aria-label': aria_label diff --git a/app/controllers/admin/bulk_line_items_controller.rb b/app/controllers/admin/bulk_line_items_controller.rb index 9537756a6c9..c1d966e545d 100644 --- a/app/controllers/admin/bulk_line_items_controller.rb +++ b/app/controllers/admin/bulk_line_items_controller.rb @@ -35,7 +35,7 @@ def update order.with_lock do if order.contents.update_item(@line_item, line_item_params) # No Content, does not trigger ng resource auto-update - render body: nil, status: :no_content + head :no_content else render json: { errors: @line_item.errors }, status: :precondition_failed end @@ -49,7 +49,7 @@ def destroy authorize! :update, order order.contents.remove(@line_item.variant) - render body: nil, status: :no_content # No Content, does not trigger ng resource auto-update + head :no_content # No Content, does not trigger ng resource auto-update end private diff --git a/app/controllers/admin/column_preferences_controller.rb b/app/controllers/admin/column_preferences_controller.rb index fcf627f1b79..5403a9a5eef 100644 --- a/app/controllers/admin/column_preferences_controller.rb +++ b/app/controllers/admin/column_preferences_controller.rb @@ -4,17 +4,25 @@ module Admin class ColumnPreferencesController < Admin::ResourceController before_action :load_collection, only: [:bulk_update] - respond_to :json - def bulk_update @cp_set.collection.each { |cp| authorize! :bulk_update, cp } - if @cp_set.save - render json: @cp_set.collection, each_serializer: Api::Admin::ColumnPreferenceSerializer - elsif @cp_set.errors.present? - render json: { errors: @cp_set.errors }, status: :bad_request - else - render body: nil, status: :internal_server_error + respond_to do |format| + if @cp_set.save + format.json { + render json: @cp_set.collection, each_serializer: Api::Admin::ColumnPreferenceSerializer + } + format.turbo_stream { + flash.now[:success] = t('.success') + render :bulk_update, locals: { action: permitted_params[:action_name] } + } + else + format.json { render json: { errors: @cp_set.errors }, status: :bad_request } + format.turbo_stream { + flash.now[:error] = @cp_set.errors.full_messages.to_sentence + render :bulk_update, locals: { action: permitted_params[:action_name] } + } + end end end @@ -28,11 +36,26 @@ def permitted_params end def load_collection - collection_hash = Hash[permitted_params[:column_preferences]. - each_with_index.map { |cp, i| [i, cp] }] - collection_hash.select!{ |_i, cp| cp[:action_name] == permitted_params[:action_name] } - @cp_set = Sets::ColumnPreferenceSet.new(@column_preferences, - collection_attributes: collection_hash) + collection_attributes = nil + + respond_to do |format| + format.json do + collection_attributes = Hash[permitted_params[:column_preferences]. + each_with_index.map { |cp, i| [i, cp] }] + collection_attributes.select!{ |_i, cp| + cp[:action_name] == permitted_params[:action_name] + } + end + format.all do + # Inject action name and user ID for each column_preference + collection_attributes = permitted_params[:column_preferences].to_h.each_value { |cp| + cp[:action_name] = permitted_params[:action_name] + cp[:user_id] = spree_current_user.id + } + end + end + + @cp_set = Sets::ColumnPreferenceSet.new(@column_preferences, collection_attributes:) end def collection diff --git a/app/controllers/admin/connected_apps_controller.rb b/app/controllers/admin/connected_apps_controller.rb new file mode 100644 index 00000000000..2cbaca7c9bd --- /dev/null +++ b/app/controllers/admin/connected_apps_controller.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module Admin + class ConnectedAppsController < ApplicationController + def create + authorize! :admin, enterprise + + app = ConnectedApp.create!(enterprise_id: enterprise.id) + + ConnectAppJob.perform_later( + app, spree_current_user.spree_api_key, + channel: SessionChannel.for_request(request), + ) + + render_panel + end + + def destroy + authorize! :admin, enterprise + + app = enterprise.connected_apps.first + app.destroy + + WebhookDeliveryJob.perform_later( + app.data["destroy"], + "disconnect-app", + nil + ) + + render_panel + end + + private + + def enterprise + @enterprise ||= Enterprise.find(params.require(:enterprise_id)) + end + + def render_panel + redirect_to "#{edit_admin_enterprise_path(enterprise)}#/connected_apps_panel" + end + end +end diff --git a/app/controllers/admin/dfc_product_imports_controller.rb b/app/controllers/admin/dfc_product_imports_controller.rb index 1b3f8dfb880..c1076ea775e 100644 --- a/app/controllers/admin/dfc_product_imports_controller.rb +++ b/app/controllers/admin/dfc_product_imports_controller.rb @@ -20,7 +20,7 @@ def index catalog_url = params.require(:catalog_url) - json_catalog = DfcRequest.new(spree_current_user).get(catalog_url) + json_catalog = fetch_catalog(catalog_url) graph = DfcIo.import(json_catalog) # * First step: import all products for given enterprise. @@ -34,6 +34,16 @@ def index private + def fetch_catalog(url) + if url =~ /food-data-collaboration/ + fdc_json = FdcRequest.new(spree_current_user).call(url) + fdc_message = JSON.parse(fdc_json) + fdc_message["products"] + else + DfcRequest.new(spree_current_user).call(url) + end + end + # Most of this code is the same as in the DfcProvider::SuppliedProductsController. def import_product(subject, enterprise) return unless subject.is_a? DataFoodConsortium::Connector::SuppliedProduct diff --git a/app/controllers/admin/products_v3_controller.rb b/app/controllers/admin/products_v3_controller.rb index 667706aeba9..2954094d6d2 100644 --- a/app/controllers/admin/products_v3_controller.rb +++ b/app/controllers/admin/products_v3_controller.rb @@ -1,13 +1,16 @@ # frozen_string_literal: true +# rubocop:disable Metrics/ClassLength module Admin class ProductsV3Controller < Spree::Admin::BaseController + helper ProductsHelper + before_action :init_filters_params before_action :init_pagination_params def index fetch_products - render "index", locals: { producers:, categories:, flash: } + render "index", locals: { producers:, categories:, tax_category_options:, flash: } end def bulk_update @@ -24,7 +27,44 @@ def bulk_update elsif product_set.errors.present? @error_counts = { saved: product_set.saved_count, invalid: product_set.invalid.count } - render "index", status: :unprocessable_entity, locals: { producers:, categories:, flash: } + render "index", status: :unprocessable_entity, + locals: { producers:, categories:, tax_category_options:, flash: } + end + end + + def destroy + @record = ProductScopeQuery.new( + spree_current_user, + { id: params[:id] } + ).find_product + + status = :ok + if @record.destroy + flash.now[:success] = t('.delete_product.success') + else + flash.now[:error] = t('.delete_product.error') + status = :internal_server_error + end + + respond_with do |format| + format.turbo_stream { render :destroy_product_variant, status: } + end + end + + def destroy_variant + @record = Spree::Variant.active.find(params[:id]) + authorize! :delete, @record + + status = :ok + if VariantDeleter.new.delete(@record) + flash.now[:success] = t('.delete_variant.success') + else + flash.now[:error] = t('.delete_variant.error') + status = :internal_server_error + end + + respond_with do |format| + format.turbo_stream { render :destroy_product_variant, status: } end end @@ -47,6 +87,7 @@ def init_pagination_params # prority is given to element dataset (if present) over url params @page = params[:page].presence || 1 @per_page = params[:per_page].presence || 15 + @q = params.permit(q: {})[:q] || { s: 'name asc' } end def producers @@ -59,6 +100,10 @@ def categories Spree::Taxon.order(:name).map { |c| [c.name, c.id] } end + def tax_category_options + Spree::TaxCategory.order(:name).pluck(:name, :id) + end + def fetch_products product_query = OpenFoodNetwork::Permissions.new(spree_current_user) .editable_products.merge(product_scope).ransack(ransack_query).result @@ -84,6 +129,8 @@ def ransack_query query.merge!(Spree::Variant::SEARCH_KEY => @search_term) end query.merge!(variants_primary_taxon_id_in: @category_id) if @category_id.present? + query.merge!(@q) if @q + query end @@ -137,3 +184,4 @@ def products_bulk_params end end end +# rubocop:enable Metrics/ClassLength diff --git a/app/controllers/admin/resource_controller.rb b/app/controllers/admin/resource_controller.rb index b47336f0d16..b15a576f408 100644 --- a/app/controllers/admin/resource_controller.rb +++ b/app/controllers/admin/resource_controller.rb @@ -146,7 +146,7 @@ def parent return nil if parent_data.blank? @parent ||= parent_data[:model_class]. - public_send("find_by", parent_data[:find_by] => params["#{model_name}_id"]) + find_by(parent_data[:find_by] => params["#{model_name}_id"]) instance_variable_set("@#{model_name}", @parent) end diff --git a/app/controllers/admin/stripe_connect_settings_controller.rb b/app/controllers/admin/stripe_connect_settings_controller.rb index 54128e6bb08..11a5a2dc698 100644 --- a/app/controllers/admin/stripe_connect_settings_controller.rb +++ b/app/controllers/admin/stripe_connect_settings_controller.rb @@ -37,7 +37,7 @@ def redirect_to_edit def obfuscated_secret_key key = Stripe.api_key - key.first(8) + "****" + key.last(4) + "#{key.first(8)}****#{key.last(4)}" end def settings_params diff --git a/app/controllers/admin/tag_rules_controller.rb b/app/controllers/admin/tag_rules_controller.rb index fd00ea66be3..d7a749a3a79 100644 --- a/app/controllers/admin/tag_rules_controller.rb +++ b/app/controllers/admin/tag_rules_controller.rb @@ -5,7 +5,7 @@ class TagRulesController < Admin::ResourceController respond_to :json respond_override destroy: { json: { - success: lambda { render body: nil, status: :no_content } + success: lambda { head :no_content } } } def map_by_tag diff --git a/app/controllers/api/v0/enterprise_fees_controller.rb b/app/controllers/api/v0/enterprise_fees_controller.rb index 45957672a7e..25b696349d9 100644 --- a/app/controllers/api/v0/enterprise_fees_controller.rb +++ b/app/controllers/api/v0/enterprise_fees_controller.rb @@ -9,7 +9,7 @@ def destroy authorize! :destroy, enterprise_fee if enterprise_fee.destroy - render plain: I18n.t(:successfully_removed), status: :no_content + head :no_content else render plain: enterprise_fee.errors.full_messages.first, status: :forbidden end diff --git a/app/controllers/api/v0/products_controller.rb b/app/controllers/api/v0/products_controller.rb index eead37ca494..a85b1986d95 100644 --- a/app/controllers/api/v0/products_controller.rb +++ b/app/controllers/api/v0/products_controller.rb @@ -42,8 +42,9 @@ def destroy authorize! :delete, Spree::Product @product = product_finder.find_product authorize! :delete, @product + @product.destroyed_by = current_api_user @product.destroy - render json: @product, serializer: Api::Admin::ProductSerializer, status: :no_content + head :no_content end def bulk_products diff --git a/app/controllers/api/v0/taxons_controller.rb b/app/controllers/api/v0/taxons_controller.rb index c6b889af434..75e85f54351 100644 --- a/app/controllers/api/v0/taxons_controller.rb +++ b/app/controllers/api/v0/taxons_controller.rb @@ -55,7 +55,7 @@ def update def destroy authorize! :delete, Spree::Taxon taxon.destroy - render json: taxon, serializer: Api::TaxonSerializer, status: :no_content + head :no_content end private diff --git a/app/controllers/api/v0/variants_controller.rb b/app/controllers/api/v0/variants_controller.rb index bac05797107..33131f67371 100644 --- a/app/controllers/api/v0/variants_controller.rb +++ b/app/controllers/api/v0/variants_controller.rb @@ -44,7 +44,7 @@ def destroy authorize! :delete, @variant VariantDeleter.new.delete(@variant) - render json: @variant, serializer: Api::VariantSerializer, status: :no_content + head :no_content end private diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f0bc1c02550..c31e748a302 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -28,7 +28,6 @@ class ApplicationController < ActionController::Base helper 'injection' helper 'markdown' helper 'footer_links' - helper 'discourse' helper 'checkout' helper 'link' helper 'terms_and_conditions' @@ -61,7 +60,7 @@ def redirect_to(options = {}, response_status = {}) rescue StandardError 'unknown' end}") - super(options, response_status) + super end def set_checkout_redirect diff --git a/app/controllers/discourse_sso_controller.rb b/app/controllers/discourse_sso_controller.rb deleted file mode 100644 index 8ac609e9311..00000000000 --- a/app/controllers/discourse_sso_controller.rb +++ /dev/null @@ -1,52 +0,0 @@ -# frozen_string_literal: true - -require 'discourse/single_sign_on' - -class DiscourseSsoController < ApplicationController - include SharedHelper - include DiscourseHelper - - before_action :require_config - - def login - if require_activation? - redirect_to discourse_url - else - redirect_to discourse_login_url - end - end - - def sso - if spree_current_user - begin - redirect_to sso_url - rescue TypeError - render plain: "Bad SingleSignOn request.", status: :bad_request - end - else - redirect_to login_path - end - end - - private - - def sso_url - secret = discourse_sso_secret! - sso = Discourse::SingleSignOn.parse(request.query_string, secret) - sso.email = spree_current_user.email - sso.username = spree_current_user.login - sso.external_id = spree_current_user.id - sso.sso_secret = secret - sso.admin = admin_user? - sso.require_activation = require_activation? - sso.to_url(discourse_sso_url) - end - - def require_config - raise ActionController::RoutingError, 'Not Found' unless discourse_configured? - end - - def require_activation? - !admin_user? && !spree_current_user.confirmed? - end -end diff --git a/app/controllers/spree/admin/images_controller.rb b/app/controllers/spree/admin/images_controller.rb index 0e0890a229e..cb1ebe40ac1 100644 --- a/app/controllers/spree/admin/images_controller.rb +++ b/app/controllers/spree/admin/images_controller.rb @@ -3,6 +3,8 @@ module Spree module Admin class ImagesController < ::Admin::ResourceController + helper ::Admin::ProductsHelper + # This will make resource controller redirect correctly after deleting product images. # This can be removed after upgrading to Spree 2.1. # See here https://github.com/spree/spree/commit/334a011d2b8e16355e4ae77ae07cd93f7cbc8fd1 @@ -17,7 +19,10 @@ def index def new @url_filters = ::ProductFilters.new.extract(request.query_parameters) - render layout: !request.xhr? + respond_with do |format| + format.turbo_stream { render :edit } + format.all { render layout: !request.xhr? } + end end def edit @@ -32,13 +37,14 @@ def create if @object.save flash[:success] = flash_message_for(@object, :successfully_created) - redirect_to location_after_save + + respond_to do |format| + format.html { redirect_to location_after_save } + format.turbo_stream { render :update } + end else - respond_with(@object) + respond_with_error(@object.errors) end - rescue ActiveStorage::IntegrityError - @object.errors.add :attachment, :integrity_error - respond_with(@object) end def update @@ -47,13 +53,14 @@ def update if @object.update(permitted_resource_params) flash[:success] = flash_message_for(@object, :successfully_updated) - redirect_to location_after_save + + respond_to do |format| + format.html { redirect_to location_after_save } + format.turbo_stream + end else - respond_with(@object) + respond_with_error(@object.errors) end - rescue ActiveStorage::IntegrityError - @object.errors.add :attachment, :integrity_error - respond_with(@object) end def destroy @@ -103,6 +110,14 @@ def permitted_resource_params :attachment, :viewable_id, :alt ) end + + def respond_with_error(errors) + @errors = errors.map(&:full_message) + respond_to do |format| + format.html { respond_with(@object) } + format.turbo_stream { render :edit } + end + end end end end diff --git a/app/controllers/spree/admin/invoices_controller.rb b/app/controllers/spree/admin/invoices_controller.rb index 8fa92475a3c..701652e0312 100644 --- a/app/controllers/spree/admin/invoices_controller.rb +++ b/app/controllers/spree/admin/invoices_controller.rb @@ -19,8 +19,13 @@ def show def generate @order = Order.find_by(number: params[:order_id]) - authorize! :invoice, @order - ::Orders::GenerateInvoiceService.new(@order).generate_or_update_latest_invoice + if @order.distributor.can_invoice? + authorize! :invoice, @order + ::Orders::GenerateInvoiceService.new(@order).generate_or_update_latest_invoice + else + flash[:error] = t(:must_have_valid_business_number, + enterprise_name: @order.distributor.name) + end redirect_back(fallback_location: spree.admin_dashboard_path) end diff --git a/app/helpers/admin/enterprises_helper.rb b/app/helpers/admin/enterprises_helper.rb index e78029c7622..e9d337c7c08 100644 --- a/app/helpers/admin/enterprises_helper.rb +++ b/app/helpers/admin/enterprises_helper.rb @@ -14,6 +14,10 @@ def select_only_item(producers) producers.size == 1 ? producers.first.id : nil end + def managed_by_user?(enterprise) + enterprise.in?(spree_current_user.enterprises) + end + def enterprise_side_menu_items(enterprise) is_shop = enterprise.sells != "none" show_properties = !!enterprise.is_primary_producer diff --git a/app/helpers/admin/orders_helper.rb b/app/helpers/admin/orders_helper.rb index 4e82a417391..3ef8ef34a52 100644 --- a/app/helpers/admin/orders_helper.rb +++ b/app/helpers/admin/orders_helper.rb @@ -11,9 +11,25 @@ module OrdersHelper def order_adjustments_for_display(order) order.adjustments + voucher_included_tax_representations(order) + + additional_tax_total_representation(order) + order.all_adjustments.payment_fee.eligible end + def additional_tax_total_representation(order) + adjustment = Spree::Adjustment.additional.tax.where( + order_id: order.id, adjustable_type: 'Spree::Adjustment' + ).sum(:amount) + + return [] unless adjustment != 0 + + [ + AdjustmentData.new( + I18n.t("admin.orders.edit.tax_on_fees"), + adjustment + ) + ] + end + def voucher_included_tax_representations(order) return [] unless VoucherAdjustmentsService.new(order).voucher_included_tax.negative? diff --git a/app/helpers/admin/products_helper.rb b/app/helpers/admin/products_helper.rb new file mode 100644 index 00000000000..e29b3783428 --- /dev/null +++ b/app/helpers/admin/products_helper.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Admin + module ProductsHelper + def product_image_form_path(product) + if product.image.present? + edit_admin_product_image_path(product.id, product.image.id) + else + new_admin_product_image_path(product.id) + end + end + end +end diff --git a/app/helpers/bulk_form_builder.rb b/app/helpers/bulk_form_builder.rb index dcb45ae3bc4..cd1da4e54eb 100644 --- a/app/helpers/bulk_form_builder.rb +++ b/app/helpers/bulk_form_builder.rb @@ -8,6 +8,6 @@ def text_field(field, **opts) opts[:class] = "#{opts[:class]} changed".strip end - super(field, **opts) + super end end diff --git a/app/helpers/discourse_helper.rb b/app/helpers/discourse_helper.rb deleted file mode 100644 index 28b45209a20..00000000000 --- a/app/helpers/discourse_helper.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -module DiscourseHelper - def discourse_configured? - discourse_url.present? - end - - def discourse_url - ENV.fetch('DISCOURSE_URL', nil) - end - - def discourse_login_url - discourse_url + '/login' - end - - def discourse_sso_url - discourse_url + '/session/sso_login' - end - - def discourse_url! - discourse_url || raise('Missing Discourse URL') - end - - def discourse_sso_secret! - ENV['DISCOURSE_SSO_SECRET'] || raise('Missing SSO secret') - end -end diff --git a/app/helpers/enterprises_helper.rb b/app/helpers/enterprises_helper.rb index 4a7c6ae817d..367b69b690e 100644 --- a/app/helpers/enterprises_helper.rb +++ b/app/helpers/enterprises_helper.rb @@ -31,7 +31,7 @@ def editable_enterprises def enterprises_options(enterprises) enterprises.map { |enterprise| - [enterprise.name + ": " + enterprise.address.address1 + ", " + enterprise.address.city, + ["#{enterprise.name}: #{enterprise.address.address1}, #{enterprise.address.city}", enterprise.id.to_i] } end diff --git a/app/helpers/map_helper.rb b/app/helpers/map_helper.rb index bc3b66c49cb..5952187077d 100644 --- a/app/helpers/map_helper.rb +++ b/app/helpers/map_helper.rb @@ -2,7 +2,9 @@ module MapHelper def using_google_maps? - ENV["GOOGLE_MAPS_API_KEY"].present? || google_maps_configured_with_geocoder_api_key? + !ContentConfig.open_street_map_enabled && ( + ENV["GOOGLE_MAPS_API_KEY"].present? || google_maps_configured_with_geocoder_api_key? + ) end private diff --git a/app/helpers/spree/admin/base_helper.rb b/app/helpers/spree/admin/base_helper.rb index 4d46a8e297e..badeb0783de 100644 --- a/app/helpers/spree/admin/base_helper.rb +++ b/app/helpers/spree/admin/base_helper.rb @@ -108,7 +108,7 @@ def preference_fields(object, form) object.preferences.keys.map { |key| preference_label = form.label("preferred_#{key}", - Spree.t(key.to_s.gsub("_from_list", "")) + ": ") + "#{Spree.t(key.to_s.gsub('_from_list', ''))}: ") preference_field = preference_field_for( form, "preferred_#{key}", @@ -120,7 +120,7 @@ def preference_fields(object, form) def link_to_add_fields(name, target, options = {}) name = '' if options[:no_text] - css_classes = options[:class] ? options[:class] + " spree_add_fields" : "spree_add_fields" + css_classes = options[:class] ? "#{options[:class]} spree_add_fields" : "spree_add_fields" link_to_with_icon('icon-plus', name, 'javascript:', diff --git a/app/helpers/spree/admin/orders_helper.rb b/app/helpers/spree/admin/orders_helper.rb index 71970c53d38..fc4f21baa82 100644 --- a/app/helpers/spree/admin/orders_helper.rb +++ b/app/helpers/spree/admin/orders_helper.rb @@ -34,6 +34,10 @@ def order_links(order) links end + def order_shipment_ready?(order) + order.ready_to_ship? + end + private def complete_order_links(order) diff --git a/app/jobs/connect_app_job.rb b/app/jobs/connect_app_job.rb index 43d273f1551..2474343a292 100644 --- a/app/jobs/connect_app_job.rb +++ b/app/jobs/connect_app_job.rb @@ -17,7 +17,7 @@ def perform(app, token, channel: nil) return unless channel - selector = "#edit_enterprise_#{enterprise.id} #connected-app-discover-regen" + selector = "#connected-app-discover-regen.enterprise_#{enterprise.id}" html = ApplicationController.render( partial: "admin/enterprises/form/connected_apps", locals: { enterprise: }, diff --git a/app/mailers/spree/user_mailer.rb b/app/mailers/spree/user_mailer.rb index 02e24194bcd..3797fcd9b42 100644 --- a/app/mailers/spree/user_mailer.rb +++ b/app/mailers/spree/user_mailer.rb @@ -25,7 +25,7 @@ def signup_confirmation(user) @user = user I18n.with_locale valid_locale(@user) do mail(to: user.email, - subject: t(:welcome_to) + ' ' + Spree::Config[:site_name]) + subject: "#{t(:welcome_to)} #{Spree::Config[:site_name]}") end end diff --git a/app/models/concerns/file_preferences.rb b/app/models/concerns/file_preferences.rb index 68682b3263a..00dedce4961 100644 --- a/app/models/concerns/file_preferences.rb +++ b/app/models/concerns/file_preferences.rb @@ -22,7 +22,7 @@ def preference_type(key) if has_preference?("#{key}_blob_id") :file else - super(key) + super end end diff --git a/app/models/concerns/log_destroy_performer.rb b/app/models/concerns/log_destroy_performer.rb new file mode 100644 index 00000000000..d53d8ce3bdd --- /dev/null +++ b/app/models/concerns/log_destroy_performer.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'active_support/concern' + +module LogDestroyPerformer + extend ActiveSupport::Concern + included do + attr_accessor :destroyed_by + + after_destroy :log_who_destroyed + + def log_who_destroyed + return if destroyed_by.nil? + + Rails.logger.info "#{self.class} #{id} deleted by #{destroyed_by.id}" + end + end +end diff --git a/app/models/enterprise.rb b/app/models/enterprise.rb index 22a18473a9f..5a1ec12d23c 100644 --- a/app/models/enterprise.rb +++ b/app/models/enterprise.rb @@ -43,25 +43,31 @@ class Enterprise < ApplicationRecord foreign_key: 'supplier_id', dependent: :destroy has_many :supplied_variants, through: :supplied_products, source: :variants - has_many :distributed_orders, class_name: 'Spree::Order', foreign_key: 'distributor_id' + has_many :distributed_orders, class_name: 'Spree::Order', + foreign_key: 'distributor_id', + dependent: :restrict_with_exception belongs_to :address, class_name: 'Spree::Address' belongs_to :business_address, optional: true, class_name: 'Spree::Address', dependent: :destroy - has_many :enterprise_fees + has_many :enterprise_fees, dependent: :restrict_with_exception has_many :enterprise_roles, dependent: :destroy has_many :users, through: :enterprise_roles belongs_to :owner, class_name: 'Spree::User', inverse_of: :owned_enterprises has_many :distributor_payment_methods, - inverse_of: :distributor, foreign_key: :distributor_id + inverse_of: :distributor, + foreign_key: :distributor_id, + dependent: :restrict_with_exception has_many :distributor_shipping_methods, - inverse_of: :distributor, foreign_key: :distributor_id + inverse_of: :distributor, + foreign_key: :distributor_id, + dependent: :restrict_with_exception has_many :payment_methods, through: :distributor_payment_methods has_many :shipping_methods, through: :distributor_shipping_methods has_many :customers, dependent: :destroy has_many :inventory_items, dependent: :destroy has_many :tag_rules, dependent: :destroy has_one :stripe_account, dependent: :destroy - has_many :vouchers + has_many :vouchers, dependent: :restrict_with_exception has_many :connected_apps, dependent: :destroy has_one :custom_tab, dependent: :destroy @@ -128,6 +134,7 @@ class Enterprise < ApplicationRecord after_create :set_default_contact after_create :relate_to_owners_enterprises + after_rollback :restore_permalink after_touch :touch_distributors after_create_commit :send_welcome_email @@ -240,6 +247,16 @@ def self.distinct_count count(distinct: true) end + # Remove any unsupported HTML. + def long_description + HtmlSanitizer.sanitize(super) + end + + # Remove any unsupported HTML. + def long_description=(html) + super(HtmlSanitizer.sanitize(html)) + end + def contact contact = users.where(enterprise_roles: { receives_notifications: true }).first contact || owner @@ -359,7 +376,7 @@ def is_hub def category # Make this crazy logic human readable so we can argue about it sanely. cat = is_primary_producer ? "producer_" : "non_producer_" - cat << ("sells_" + sells) + cat << ("sells_#{sells}") # Map backend cases to front end cases. case cat @@ -493,7 +510,7 @@ def strip_url(url) end def correct_whatsapp_url(phone_number) - phone_number && ("https://wa.me/" + phone_number.tr('+ ', '')) + phone_number && "https://wa.me/#{phone_number.tr('+ ', '')}" end def correct_instagram_url(url) diff --git a/app/models/enterprise_fee.rb b/app/models/enterprise_fee.rb index a4bcdd272d2..16f61a3cd32 100644 --- a/app/models/enterprise_fee.rb +++ b/app/models/enterprise_fee.rb @@ -21,7 +21,6 @@ class EnterpriseFee < ApplicationRecord validates :fee_type, inclusion: { in: FEE_TYPES } validates :name, presence: true - validates :enterprise_id, presence: true before_save :ensure_valid_tax_category_settings diff --git a/app/models/enterprise_group.rb b/app/models/enterprise_group.rb index c6160fb404b..47a0ef43030 100644 --- a/app/models/enterprise_group.rb +++ b/app/models/enterprise_group.rb @@ -74,6 +74,16 @@ def to_param permalink end + # Remove any unsupported HTML. + def long_description + HtmlSanitizer.sanitize(super) + end + + # Remove any unsupported HTML. + def long_description=(html) + super(HtmlSanitizer.sanitize(html)) + end + private def sanitize_permalink diff --git a/app/models/exchange.rb b/app/models/exchange.rb index 796a251ed1a..32aa3237abc 100644 --- a/app/models/exchange.rb +++ b/app/models/exchange.rb @@ -10,8 +10,6 @@ # shopfront (outgoing products). But the set of shown products can be smaller # than all incoming products. class Exchange < ApplicationRecord - self.belongs_to_required_by_default = false - acts_as_taggable belongs_to :order_cycle @@ -24,7 +22,6 @@ class Exchange < ApplicationRecord has_many :exchange_fees, dependent: :destroy has_many :enterprise_fees, through: :exchange_fees - validates :order_cycle, :sender, :receiver, presence: true validates :sender_id, uniqueness: { scope: [:order_cycle_id, :receiver_id, :incoming] } before_destroy :delete_related_exchange_variants, prepend: true diff --git a/app/models/inventory_item.rb b/app/models/inventory_item.rb index d013ea52f23..8d90a4271f0 100644 --- a/app/models/inventory_item.rb +++ b/app/models/inventory_item.rb @@ -1,14 +1,10 @@ # frozen_string_literal: true class InventoryItem < ApplicationRecord - self.belongs_to_required_by_default = false - belongs_to :enterprise belongs_to :variant, class_name: "Spree::Variant" validates :variant_id, uniqueness: { scope: :enterprise_id } - validates :enterprise, presence: true - validates :variant, presence: true validates :visible, inclusion: { in: [true, false], message: I18n.t(:inventory_item_visibility_error) } diff --git a/app/models/order_cycle.rb b/app/models/order_cycle.rb index e6b0d1dff1a..060f75e4f06 100644 --- a/app/models/order_cycle.rb +++ b/app/models/order_cycle.rb @@ -3,8 +3,6 @@ require 'open_food_network/scope_variant_to_hub' class OrderCycle < ApplicationRecord - self.belongs_to_required_by_default = false - searchable_attributes :orders_open_at, :orders_close_at, :coordinator_id searchable_scopes :active, :inactive, :active_or_complete, :upcoming, :closed, :not_closed, :dated, :undated, :soonest_opening, :soonest_closing, :most_recently_closed @@ -44,7 +42,7 @@ class OrderCycle < ApplicationRecord before_update :reset_processed_at, if: :will_save_change_to_orders_close_at? after_save :sync_subscriptions, if: :opening? - validates :name, :coordinator_id, presence: true + validates :name, presence: true validate :orders_close_at_after_orders_open_at? preference :product_selection_from_coordinator_inventory_only, :boolean, default: false @@ -255,7 +253,7 @@ def receival_instructions_for(supplier) end def pickup_time_for(distributor) - exchange_for_distributor(distributor)&.pickup_time || distributor.next_collection_at + exchange_for_distributor(distributor)&.pickup_time end def pickup_instructions_for(distributor) diff --git a/app/models/spree/ability.rb b/app/models/spree/ability.rb index 037bfecdb6b..381d0b8502c 100644 --- a/app/models/spree/ability.rb +++ b/app/models/spree/ability.rb @@ -192,7 +192,7 @@ def add_product_management_abilities(user) OpenFoodNetwork::Permissions.new(user).managed_product_enterprises.include? product.supplier end - can [:admin, :index], :products_v3 + can [:admin, :index, :bulk_update, :destroy, :destroy_variant], :products_v3 can [:create], Spree::Variant can [:admin, :index, :read, :edit, diff --git a/app/models/spree/address.rb b/app/models/spree/address.rb index 59363374f1a..9d7cac881f1 100644 --- a/app/models/spree/address.rb +++ b/app/models/spree/address.rb @@ -4,19 +4,17 @@ module Spree class Address < ApplicationRecord include AddressDisplay - self.belongs_to_required_by_default = false - searchable_attributes :firstname, :lastname, :phone, :full_name, :full_name_reversed, :full_name_with_comma, :full_name_with_comma_reversed searchable_associations :country, :state belongs_to :country, class_name: "Spree::Country" - belongs_to :state, class_name: "Spree::State" + belongs_to :state, class_name: "Spree::State", optional: true has_one :enterprise, dependent: :restrict_with_exception - has_many :shipments + has_many :shipments, dependent: :restrict_with_exception - validates :address1, :city, :country, :phone, presence: true + validates :address1, :city, :phone, presence: true validates :company, presence: true, unless: -> { first_name.blank? || last_name.blank? } validates :firstname, :lastname, presence: true, if: -> do company.blank? || company == 'unused' diff --git a/app/models/spree/credit_card.rb b/app/models/spree/credit_card.rb index 35a43ee8283..74e40596a03 100644 --- a/app/models/spree/credit_card.rb +++ b/app/models/spree/credit_card.rb @@ -30,7 +30,7 @@ class CreditCard < ApplicationRecord def expiry=(expiry) self[:month], self[:year] = expiry.split(" / ") - self[:year] = "20" + self[:year] + self[:year] = "20#{self[:year]}" end def number=(num) diff --git a/app/models/spree/line_item.rb b/app/models/spree/line_item.rb index 74d3acdc7e1..eed6741b310 100644 --- a/app/models/spree/line_item.rb +++ b/app/models/spree/line_item.rb @@ -7,8 +7,6 @@ class LineItem < ApplicationRecord include VariantUnits::VariantAndLineItemNaming include LineItemStockChanges - self.belongs_to_required_by_default = false - searchable_attributes :price, :quantity, :order_id, :variant_id, :tax_category_id searchable_associations :order, :order_cycle, :variant, :product, :supplier, :tax_category searchable_scopes :with_tax, :without_tax @@ -19,7 +17,7 @@ class LineItem < ApplicationRecord belongs_to :variant, -> { with_deleted }, class_name: "Spree::Variant" has_one :product, through: :variant has_one :supplier, through: :product - belongs_to :tax_category, class_name: "Spree::TaxCategory" + belongs_to :tax_category, class_name: "Spree::TaxCategory", optional: true has_many :adjustments, as: :adjustable, dependent: :destroy @@ -28,7 +26,6 @@ class LineItem < ApplicationRecord before_validation :copy_tax_category before_validation :copy_dimensions - validates :variant, presence: true validates :quantity, numericality: { only_integer: true, greater_than: -1, diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index 03fdf5208cc..e8974272c4a 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -8,8 +8,6 @@ class Order < ApplicationRecord include Balance include SetUnusedAddressFields - self.belongs_to_required_by_default = false - searchable_attributes :number, :state, :shipment_state, :payment_state, :distributor_id, :order_cycle_id, :email, :total, :customer_id searchable_associations :shipping_method, :bill_address, :distributor @@ -33,13 +31,13 @@ class Order < ApplicationRecord token_resource - belongs_to :user, class_name: "Spree::User" - belongs_to :created_by, class_name: "Spree::User" + belongs_to :user, class_name: "Spree::User", optional: true + belongs_to :created_by, class_name: "Spree::User", optional: true - belongs_to :bill_address, class_name: 'Spree::Address' + belongs_to :bill_address, class_name: 'Spree::Address', optional: true alias_attribute :billing_address, :bill_address - belongs_to :ship_address, class_name: 'Spree::Address' + belongs_to :ship_address, class_name: 'Spree::Address', optional: true alias_attribute :shipping_address, :ship_address has_many :state_changes, as: :stateful, dependent: :destroy @@ -70,9 +68,9 @@ def states dependent: :destroy has_many :invoices, dependent: :restrict_with_exception - belongs_to :order_cycle - belongs_to :distributor, class_name: 'Enterprise' - belongs_to :customer + belongs_to :order_cycle, optional: true + belongs_to :distributor, class_name: 'Enterprise', optional: true + belongs_to :customer, optional: true has_one :proxy_order, dependent: :destroy has_one :subscription, through: :proxy_order diff --git a/app/models/spree/payment.rb b/app/models/spree/payment.rb index 6479694df9c..e10920d4b84 100644 --- a/app/models/spree/payment.rb +++ b/app/models/spree/payment.rb @@ -155,6 +155,7 @@ def ensure_correct_adjustment if adjustment adjustment.originator = payment_method adjustment.label = adjustment_label + adjustment.amount = payment_method.compute_amount(self) adjustment.save elsif !processing_refund? && payment_method.present? payment_method.create_adjustment(adjustment_label, self, true) diff --git a/app/models/spree/payment_method.rb b/app/models/spree/payment_method.rb index a7295710665..b66d8d239be 100644 --- a/app/models/spree/payment_method.rb +++ b/app/models/spree/payment_method.rb @@ -118,7 +118,7 @@ def has_distributor?(distributor) end def self.clean_name - i18n_key = "spree.admin.payment_methods.providers." + name.demodulize.downcase + i18n_key = "spree.admin.payment_methods.providers.#{name.demodulize.downcase}" I18n.t(i18n_key) end diff --git a/app/models/spree/payment_method/check.rb b/app/models/spree/payment_method/check.rb index 9f4378830c0..839698bebcf 100644 --- a/app/models/spree/payment_method/check.rb +++ b/app/models/spree/payment_method/check.rb @@ -25,6 +25,10 @@ def void(*_args) ActiveMerchant::Billing::Response.new(true, "", {}, {}) end + def payment_source_class + nil + end + def source_required? false end diff --git a/app/models/spree/price.rb b/app/models/spree/price.rb index 668f53b6b91..0c2d12c285f 100644 --- a/app/models/spree/price.rb +++ b/app/models/spree/price.rb @@ -24,10 +24,6 @@ def price amount end - def price_changed? - amount_changed? - end - def price=(price) self[:amount] = parse_price(price) end diff --git a/app/models/spree/product.rb b/app/models/spree/product.rb index 4fd670f90e5..1f79ebf95c8 100755 --- a/app/models/spree/product.rb +++ b/app/models/spree/product.rb @@ -23,6 +23,7 @@ module Spree class Product < ApplicationRecord include ProductStock + include LogDestroyPerformer self.belongs_to_required_by_default = false @@ -303,6 +304,16 @@ def variant_unit_with_scale=(variant_unit_with_scale) ) end + # Remove any unsupported HTML. + def description + HtmlSanitizer.sanitize(super) + end + + # Remove any unsupported HTML. + def description=(html) + super(HtmlSanitizer.sanitize(html)) + end + private def update_units diff --git a/app/models/spree/product_property.rb b/app/models/spree/product_property.rb index 653c4464644..64736a4c398 100644 --- a/app/models/spree/product_property.rb +++ b/app/models/spree/product_property.rb @@ -2,12 +2,9 @@ module Spree class ProductProperty < ApplicationRecord - self.belongs_to_required_by_default = false - belongs_to :product, class_name: "Spree::Product", touch: true belongs_to :property, class_name: 'Spree::Property' - validates :property, presence: true validates :value, length: { maximum: 255 } default_scope -> { order("#{table_name}.position") } diff --git a/app/models/spree/return_authorization.rb b/app/models/spree/return_authorization.rb index 1b18b9ea4fa..9d7a7dea2d3 100644 --- a/app/models/spree/return_authorization.rb +++ b/app/models/spree/return_authorization.rb @@ -2,8 +2,6 @@ module Spree class ReturnAuthorization < ApplicationRecord - self.belongs_to_required_by_default = false - acts_as_paranoid belongs_to :order, class_name: 'Spree::Order', inverse_of: :return_authorizations @@ -13,7 +11,6 @@ class ReturnAuthorization < ApplicationRecord before_save :force_positive_amount before_create :generate_number - validates :order, presence: true validates :amount, numericality: true validate :must_have_shipped_units diff --git a/app/models/spree/state.rb b/app/models/spree/state.rb index cbbd159a557..1d310636daa 100644 --- a/app/models/spree/state.rb +++ b/app/models/spree/state.rb @@ -2,11 +2,9 @@ module Spree class State < ApplicationRecord - self.belongs_to_required_by_default = false - belongs_to :country, class_name: 'Spree::Country' - validates :country, :name, presence: true + validates :name, presence: true def self.find_all_by_name_or_abbr(name_or_abbr) where('name = ? OR abbr = ?', name_or_abbr, name_or_abbr) diff --git a/app/models/spree/stock_item.rb b/app/models/spree/stock_item.rb index 192a154b3de..a89a44975e6 100644 --- a/app/models/spree/stock_item.rb +++ b/app/models/spree/stock_item.rb @@ -2,15 +2,12 @@ module Spree class StockItem < ApplicationRecord - self.belongs_to_required_by_default = false - acts_as_paranoid belongs_to :stock_location, class_name: 'Spree::StockLocation', inverse_of: :stock_items belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant' - has_many :stock_movements + has_many :stock_movements, dependent: :destroy - validates :stock_location, :variant, presence: true validates :variant_id, uniqueness: { scope: [:stock_location_id, :deleted_at] } validates :count_on_hand, numericality: { greater_than_or_equal_to: 0, unless: :backorderable? } diff --git a/app/models/spree/stock_movement.rb b/app/models/spree/stock_movement.rb index 1cf432df5cb..4de0dea3a0f 100644 --- a/app/models/spree/stock_movement.rb +++ b/app/models/spree/stock_movement.rb @@ -2,22 +2,15 @@ module Spree class StockMovement < ApplicationRecord - self.belongs_to_required_by_default = false - belongs_to :stock_item, class_name: 'Spree::StockItem' - belongs_to :originator, polymorphic: true + belongs_to :originator, polymorphic: true, optional: true after_create :update_stock_item_quantity - validates :stock_item, presence: true validates :quantity, presence: true scope :recent, -> { order('created_at DESC') } - def readonly? - !new_record? - end - private def update_stock_item_quantity diff --git a/app/models/spree/tax_rate.rb b/app/models/spree/tax_rate.rb index 62dade25b18..af8d82f12d0 100644 --- a/app/models/spree/tax_rate.rb +++ b/app/models/spree/tax_rate.rb @@ -14,17 +14,14 @@ def validate(record) module Spree class TaxRate < ApplicationRecord - self.belongs_to_required_by_default = false - acts_as_paranoid include CalculatedAdjustments - belongs_to :zone, class_name: "Spree::Zone", inverse_of: :tax_rates + belongs_to :zone, class_name: "Spree::Zone", inverse_of: :tax_rates, optional: true belongs_to :tax_category, class_name: "Spree::TaxCategory", inverse_of: :tax_rates - has_many :adjustments, as: :originator + has_many :adjustments, as: :originator, dependent: nil validates :amount, presence: true, numericality: true - validates :tax_category, presence: true validates_with DefaultTaxZoneValidator scope :by_zone, ->(zone) { where(zone_id: zone) } diff --git a/app/models/spree/variant.rb b/app/models/spree/variant.rb index c5f93e0de9e..18b7cb0d244 100644 --- a/app/models/spree/variant.rb +++ b/app/models/spree/variant.rb @@ -32,8 +32,8 @@ class Variant < ApplicationRecord delegate :name, :name=, :description, :description=, :meta_keywords, to: :product - has_many :inventory_units, inverse_of: :variant - has_many :line_items, inverse_of: :variant + has_many :inventory_units, inverse_of: :variant, dependent: nil + has_many :line_items, inverse_of: :variant, dependent: nil has_many :stock_items, dependent: :destroy, inverse_of: :variant has_many :stock_locations, through: :stock_items @@ -49,11 +49,11 @@ class Variant < ApplicationRecord has_many :prices, class_name: 'Spree::Price', dependent: :destroy - delegate :display_price, :display_amount, :price, :price_changed?, :price=, + delegate :display_price, :display_amount, :price, :price=, :currency, :currency=, to: :find_or_build_default_price - has_many :exchange_variants + has_many :exchange_variants, dependent: nil has_many :exchanges, through: :exchange_variants has_many :variant_overrides, dependent: :destroy has_many :inventory_items, dependent: :destroy @@ -199,6 +199,11 @@ def amount_in(currency) price_in(currency).try(:amount) end + def changed? + # We consider the variant changed if associated price is changed (it is saved after_save) + super || default_price.changed? + end + # can_supply? is implemented in VariantStock def in_stock?(quantity = 1) can_supply?(quantity) diff --git a/app/models/subscription_line_item.rb b/app/models/subscription_line_item.rb index a4a0b1ede59..20a98d7ceb9 100644 --- a/app/models/subscription_line_item.rb +++ b/app/models/subscription_line_item.rb @@ -1,13 +1,9 @@ # frozen_string_literal: true class SubscriptionLineItem < ApplicationRecord - self.belongs_to_required_by_default = false - belongs_to :subscription, inverse_of: :subscription_line_items belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant' - validates :subscription, presence: true - validates :variant, presence: true validates :quantity, presence: true, numericality: { only_integer: true } default_scope { order('id ASC') } diff --git a/app/models/tag_rule.rb b/app/models/tag_rule.rb index cdff7315b04..a6b5ae4bb6f 100644 --- a/app/models/tag_rule.rb +++ b/app/models/tag_rule.rb @@ -1,14 +1,10 @@ # frozen_string_literal: true class TagRule < ApplicationRecord - self.belongs_to_required_by_default = false - belongs_to :enterprise preference :customer_tags, :string, default: "" - validates :enterprise, presence: true - scope :for, ->(enterprise) { where(enterprise_id: enterprise) } scope :prioritised, -> { order('priority ASC') } diff --git a/app/models/variant_override.rb b/app/models/variant_override.rb index af0dbd92fbc..ea5dca61b27 100644 --- a/app/models/variant_override.rb +++ b/app/models/variant_override.rb @@ -6,15 +6,11 @@ class VariantOverride < ApplicationRecord extend Spree::LocalizedNumber include StockSettingsOverrideValidation - self.belongs_to_required_by_default = false - acts_as_taggable belongs_to :hub, class_name: 'Enterprise' belongs_to :variant, class_name: 'Spree::Variant' - validates :hub, presence: true - validates :variant, presence: true # Default stock can be nil, indicating stock should not be reset or zero, meaning reset to zero. # Need to ensure this can be set by the user. validates :default_stock, numericality: { greater_than_or_equal_to: 0 }, allow_nil: true diff --git a/app/reflexes/admin/connected_app_reflex.rb b/app/reflexes/admin/connected_app_reflex.rb deleted file mode 100644 index ecfb974d969..00000000000 --- a/app/reflexes/admin/connected_app_reflex.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -module Admin - class ConnectedAppReflex < ApplicationReflex - def create - authorize! :admin, enterprise - - app = ConnectedApp.create!(enterprise_id: enterprise.id) - - # Avoid race condition by sending before enqueuing job: - broadcast_partial - - ConnectAppJob.perform_later( - app, current_user.spree_api_key, - channel: SessionChannel.for_request(request), - ) - morph :nothing - end - - def destroy - authorize! :admin, enterprise - - app = enterprise.connected_apps.first - app.destroy - - broadcast_partial - - WebhookDeliveryJob.perform_later( - app.data["destroy"], - "disconnect-app", - nil - ) - morph :nothing - end - - private - - def enterprise - @enterprise ||= Enterprise.find(element.dataset.enterprise_id) - end - - def broadcast_partial - selector = "#edit_enterprise_#{enterprise.id} #connected-app-discover-regen" - html = ApplicationController.render( - partial: "admin/enterprises/form/connected_apps", - locals: { enterprise: }, - ) - - # Avoid race condition by sending before enqueuing job: - cable_ready.morph(selector:, html:).broadcast - end - end -end diff --git a/app/reflexes/admin/orders_reflex.rb b/app/reflexes/admin/orders_reflex.rb index b52136391e0..dedf46cdf28 100644 --- a/app/reflexes/admin/orders_reflex.rb +++ b/app/reflexes/admin/orders_reflex.rb @@ -21,7 +21,8 @@ def capture def ship @order.send_shipment_email = false unless params[:send_shipment_email] if @order.ship - return set_param_for_controller if request.url.match?('edit') + paths = %w[edit customer payments adjustments invoices return_authorizations].freeze + return set_param_for_controller if Regexp.union(paths).match? request.url morph dom_id(@order), render(partial: "spree/admin/orders/table_row", locals: { order: @order.reload, success: true }) diff --git a/app/reflexes/products_reflex.rb b/app/reflexes/products_reflex.rb index 9cad290331d..a2feef4d281 100644 --- a/app/reflexes/products_reflex.rb +++ b/app/reflexes/products_reflex.rb @@ -21,46 +21,6 @@ def clear_search fetch_and_render_products_with_flash end - def delete_product - id = current_id_from_element(element) - product = product_finder(id).find_product - authorize! :delete, product - - if product.destroy - flash[:success] = I18n.t('admin.products_v3.delete_product.success') - else - flash[:error] = I18n.t('admin.products_v3.delete_product.error') - end - - fetch_and_render_products_with_flash - end - - def delete_variant - id = current_id_from_element(element) - variant = Spree::Variant.active.find(id) - authorize! :delete, variant - - if VariantDeleter.new.delete(variant) - flash[:success] = I18n.t('admin.products_v3.delete_variant.success') - else - flash[:error] = I18n.t('admin.products_v3.delete_variant.error') - end - - fetch_and_render_products_with_flash - end - - def edit_image - id = current_id_from_element(element) - product = product_finder(id).find_product - image = product.image - - image = Spree::Image.new(viewable: product) if product.image.blank? - - morph "#modal-component", - render(partial: "admin/products_v3/edit_image", - locals: { product:, image:, return_url: url }) - end - private def init_filters_params @@ -89,8 +49,8 @@ def render_products html: render(partial: "admin/products_v3/content", locals: { products: @products, pagy: @pagy, search_term: @search_term, producer_options: producers, producer_id: @producer_id, - category_options: categories, category_id: @category_id, - flashes: flash }) + category_options: categories, tax_category_options:, + category_id: @category_id, flashes: flash }) ) cable_ready.replace_state( @@ -125,6 +85,10 @@ def categories Spree::Taxon.order(:name).map { |c| [c.name, c.id] } end + def tax_category_options + Spree::TaxCategory.order(:name).pluck(:name, :id) + end + def fetch_products product_query = OpenFoodNetwork::Permissions.new(current_user) .editable_products.merge(product_scope).ransack(ransack_query).result(distinct: true) @@ -210,12 +174,4 @@ def products_bulk_params params.permit(products: ::PermittedAttributes::Product.attributes) .to_h.with_indifferent_access end - - def product_finder(id) - ProductScopeQuery.new(current_user, { id: }) - end - - def current_id_from_element(element) - element.dataset.current_id - end end diff --git a/app/serializers/api/cached_enterprise_serializer.rb b/app/serializers/api/cached_enterprise_serializer.rb index bef58f0c77a..d9e08a01559 100644 --- a/app/serializers/api/cached_enterprise_serializer.rb +++ b/app/serializers/api/cached_enterprise_serializer.rb @@ -131,7 +131,7 @@ def icon producer_shop: "map_003-producer-shop.svg", producer: "map_001-producer-only.svg", } - "/map_icons/" + (icons[enterprise.category] || "map_001-producer-only.svg") + "/map_icons/#{icons[enterprise.category] || 'map_001-producer-only.svg'}" end # Choose regular icon font for enterprises. diff --git a/app/serializers/api/enterprise_shopfront_list_serializer.rb b/app/serializers/api/enterprise_shopfront_list_serializer.rb index 8cd95c1547a..6d99d3de57c 100644 --- a/app/serializers/api/enterprise_shopfront_list_serializer.rb +++ b/app/serializers/api/enterprise_shopfront_list_serializer.rb @@ -21,7 +21,7 @@ def icon producer_shop: "map_003-producer-shop.svg", producer: "map_001-producer-only.svg", } - "/map_icons/" + (icons[enterprise.category] || "map_001-producer-only.svg") + "/map_icons/#{icons[enterprise.category] || 'map_001-producer-only.svg'}" end def icon_font diff --git a/app/services/embedded_page_service.rb b/app/services/embedded_page_service.rb index 1d4f3443841..52fc4b98c4e 100644 --- a/app/services/embedded_page_service.rb +++ b/app/services/embedded_page_service.rb @@ -59,7 +59,7 @@ def set_embedding_domain def set_logout_redirect return unless enterprise_slug - @session[:shopfront_redirect] = '/' + enterprise_slug + '/shop?embedded_shopfront=true' + @session[:shopfront_redirect] = "/#{enterprise_slug}/shop?embedded_shopfront=true" end def enterprise_slug diff --git a/app/services/html_sanitizer.rb b/app/services/html_sanitizer.rb new file mode 100644 index 00000000000..84d78f6f5cd --- /dev/null +++ b/app/services/html_sanitizer.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# Keeps only allowed HTML. +# +# We store some rich text as HTML in attributes of models like Enterprise. +# We offer an editor which supports certain tags but you can't insert just any +# HTML, which would be dangerous. +class HtmlSanitizer + # div is required by Trix editor + ALLOWED_TAGS = %w[h1 h2 h3 h4 div p br b i u a strong em del pre blockquote ul ol li hr + figure].freeze + ALLOWED_ATTRIBUTES = %w[href target].freeze + ALLOWED_TRIX_DATA_ATTRIBUTES = %w[data-trix-attachment].freeze + + def self.sanitize(html) + @sanitizer ||= Rails::HTML5::SafeListSanitizer.new + @sanitizer.sanitize( + html, tags: ALLOWED_TAGS, attributes: (ALLOWED_ATTRIBUTES + ALLOWED_TRIX_DATA_ATTRIBUTES) + ) + end +end diff --git a/app/services/products_renderer.rb b/app/services/products_renderer.rb index d7296e9fa16..57608f849a4 100644 --- a/app/services/products_renderer.rb +++ b/app/services/products_renderer.rb @@ -68,23 +68,26 @@ def distributed_products end def products_order - if (distributor.preferred_shopfront_product_sorting_method == "by_producer") && - distributor.preferred_shopfront_producer_order.present? - distributor - .preferred_shopfront_producer_order - .split(",").map { |id| "spree_products.supplier_id=#{id} DESC" } - .join(", ") + ", spree_products.name ASC, spree_products.id ASC" + if distributor.preferred_shopfront_product_sorting_method == "by_producer" && + distributor.preferred_shopfront_producer_order.present? + order_by_producer = distributor + .preferred_shopfront_producer_order + .split(",").map { |id| "spree_products.supplier_id=#{id} DESC" } + .join(", ") + "#{order_by_producer}, spree_products.name ASC, spree_products.id ASC" elsif distributor.preferred_shopfront_product_sorting_method == "by_category" && - distributor.preferred_shopfront_taxon_order.present? - distributor - .preferred_shopfront_taxon_order - .split(",").map { |id| "first_variant.primary_taxon_id=#{id} DESC" } - .join(", ") + ", spree_products.name ASC, spree_products.id ASC" + distributor.preferred_shopfront_taxon_order.present? + order_by_category = distributor + .preferred_shopfront_taxon_order + .split(",").map { |id| "first_variant.primary_taxon_id=#{id} DESC" } + .join(", ") + "#{order_by_category}, spree_products.name ASC, spree_products.id ASC" else "spree_products.name ASC, spree_products.id" end end + def variants_for_shop @variants_for_shop ||= begin scoper = OpenFoodNetwork::ScopeVariantToHub.new(distributor) diff --git a/app/services/sets/product_set.rb b/app/services/sets/product_set.rb index ba3fb402404..04138eedbc3 100644 --- a/app/services/sets/product_set.rb +++ b/app/services/sets/product_set.rb @@ -67,11 +67,12 @@ def update_product_only_attributes(product, attributes) product.assign_attributes(product_related_attrs) + return true unless product.changed? + validate_presence_of_unit_value_in_product(product) - changed = product.changed? success = product.errors.empty? && product.save - count_result(success && changed) + count_result(success) success end @@ -104,7 +105,8 @@ def update_variants_attributes(product, variants_attributes) def create_or_update_variant(product, variant_attributes) variant = find_model(product.variants, variant_attributes[:id]) if variant.present? - variant.update(variant_attributes.except(:id)) + variant.assign_attributes(variant_attributes.except(:id)) + variant.save if variant.changed? else variant = create_variant(product, variant_attributes) end diff --git a/app/views/admin/column_preferences/_form.html.haml b/app/views/admin/column_preferences/_form.html.haml new file mode 100644 index 00000000000..6296444b02e --- /dev/null +++ b/app/views/admin/column_preferences/_form.html.haml @@ -0,0 +1,23 @@ += form_with url: bulk_update_admin_column_preferences_path, method: :put, + id: :bulk_admin_column_preferences_form, class: "column-preferences", + html: { 'data-controller': "column-preferences" } do |f| + = hidden_field_tag :action_name, action + + / DC: this makes my Chrome DevTools crash when inspecting the
element. If problem continues, we need to use a different method. + %details.ofn-drop-down.ofn-drop-down-v2.right{ 'data-controller': "dropdown" } + %summary.ofn-drop-down-label + = t('admin.columns') + %span.icon-caret + + .menu + .menu_items + - ColumnPreference.for(spree_current_user, action).each_with_index do |column_preference, index| + = f.fields_for("column_preferences", column_preference, index:) do |cp_form| + = cp_form.hidden_field :id + = cp_form.hidden_field :column_name + %label.menu_item + = cp_form.check_box :visible, 'data-column-name': column_preference.column_name + %span= t("admin.products_page.columns." + column_preference.column_name) + + .actions + = f.submit t('admin.column_save_as_default'), class: "secondary fullwidth" diff --git a/app/views/admin/column_preferences/bulk_update.turbo_stream.haml b/app/views/admin/column_preferences/bulk_update.turbo_stream.haml new file mode 100644 index 00000000000..70836e46575 --- /dev/null +++ b/app/views/admin/column_preferences/bulk_update.turbo_stream.haml @@ -0,0 +1,3 @@ += turbo_stream.replace "bulk_admin_column_preferences_form" do + = render partial: "admin/shared/flashes", locals: { flashes: flash } if defined? flash + = render partial: 'form', locals: { action: } diff --git a/app/views/admin/enterprises/_form.html.haml b/app/views/admin/enterprises/_form.html.haml index dcaae1a149c..71a9b2378b3 100644 --- a/app/views/admin/enterprises/_form.html.haml +++ b/app/views/admin/enterprises/_form.html.haml @@ -9,6 +9,11 @@ %fieldset.alpha.no-border-bottom{ id: "#{item[:name]}_panel", data: { "tabs-and-panels-target": "panel" }} %legend= t(".#{ item[:name] }.legend") + - when 'connected_apps' + -# Don't render this item here in the main form. + -# The panel contains its own form and we can't nest forms in forms. + -# Otherwise we add multiple authenticity tokens and Rails denies updates. + - else %fieldset.alpha.no-border-bottom{ id: "#{item[:name]}_panel", data: { "tabs-and-panels-target": "panel" }} %legend= t(".#{ item[:form_name] || item[:name] }.legend") diff --git a/app/views/admin/enterprises/_ng_form.html.haml b/app/views/admin/enterprises/_ng_form.html.haml index 3ea83f8fbda..5fd3d9b541e 100644 --- a/app/views/admin/enterprises/_ng_form.html.haml +++ b/app/views/admin/enterprises/_ng_form.html.haml @@ -11,11 +11,4 @@ %input.red{ type: "button", value: t(:update), "ng-click": "submit()", "ng-disabled": "!enterprise_form.$dirty" } %input{ type: "button", "ng-value": "enterprise_form.$dirty ? '#{t(:cancel)}' : '#{t(:close)}'", "ng-click": "cancel('#{main_app.admin_enterprises_path}')" } - .row{ data: { - controller: "tabs-and-panels", "tabs-and-panels-class-name-value": "selected" }} - .sixteen.columns.alpha - .four.columns.alpha - = render 'admin/shared/side_menu' - .one.column   - .eleven.columns.omega.fullwidth_inputs - = render 'form', f: f + = render 'form', f: f diff --git a/app/views/admin/enterprises/edit.html.haml b/app/views/admin/enterprises/edit.html.haml index 0e6a9162b87..90fd8201c9a 100644 --- a/app/views/admin/enterprises/edit.html.haml +++ b/app/views/admin/enterprises/edit.html.haml @@ -13,4 +13,14 @@ = render 'admin/enterprises/form_data' -= render 'admin/enterprises/ng_form', action: 'edit' +.row{ data: { controller: "tabs-and-panels", "tabs-and-panels-class-name-value": "selected" }} + .sixteen.columns.alpha + .four.columns.alpha + = render 'admin/shared/side_menu' + .one.column   + .eleven.columns.omega.fullwidth_inputs + = render 'admin/enterprises/ng_form', action: 'edit' + + %fieldset.alpha.no-border-bottom{ id: "connected_apps_panel", data: { "tabs-and-panels-target": "panel" }} + %legend= t("admin.enterprises.form.connected_apps.legend") + = render "admin/enterprises/form/connected_apps", enterprise: @enterprise diff --git a/app/views/admin/enterprises/form/_connected_apps.html.haml b/app/views/admin/enterprises/form/_connected_apps.html.haml index c60a7da1a1b..2ffbceee81d 100644 --- a/app/views/admin/enterprises/form/_connected_apps.html.haml +++ b/app/views/admin/enterprises/form/_connected_apps.html.haml @@ -1,21 +1,20 @@ -- enterprise ||= f.object -#connected-app-discover-regen +%div{ id: "connected-app-discover-regen", class: "enterprise_#{enterprise.id}" } .connected-app__head %div %h3= t ".title" %p= t ".tagline" %div - if enterprise.connected_apps.empty? - %button{ data: {reflex: "click->Admin::ConnectedApp#create", enterprise_id: enterprise.id} } - = t ".enable" + = button_to t(".enable"), admin_enterprise_connected_apps_path(enterprise.id), method: :post, disabled: !managed_by_user?(enterprise) + -# This is only seen by super-admins: + %em= t(".need_to_be_manager") unless managed_by_user?(enterprise) - elsif enterprise.connected_apps.connecting.present? %button{ disabled: true } %i.spinner.fa.fa-spin.fa-circle-o-notch   = t ".loading" - else - %button{ data: {reflex: "click->Admin::ConnectedApp#destroy", enterprise_id: enterprise.id} } - = t ".disable" + = button_to t(".disable"), admin_enterprise_connected_app_path(0, enterprise_id: enterprise.id), method: :delete .connected-app__connection - if enterprise.connected_apps.ready.present? diff --git a/app/views/admin/products_v3/_content.html.haml b/app/views/admin/products_v3/_content.html.haml index dcb29e945fe..0a9459abae9 100644 --- a/app/views/admin/products_v3/_content.html.haml +++ b/app/views/admin/products_v3/_content.html.haml @@ -15,7 +15,7 @@ .container.results .sixteen.columns = render partial: 'sort', locals: { pagy: pagy, search_term: search_term, producer_id: producer_id, category_id: category_id } - = render partial: 'table', locals: { products: products } + = render partial: 'table', locals: { products:, producer_options:, category_options:, tax_category_options: } - if pagy.present? && pagy.pages > 1 = render partial: 'admin/shared/stimulus_pagination', locals: { pagy: pagy } - else diff --git a/app/views/admin/products_v3/_delete_modal.html.haml b/app/views/admin/products_v3/_delete_modal.html.haml index 40b6fbd32d6..87208c5dbe1 100644 --- a/app/views/admin/products_v3/_delete_modal.html.haml +++ b/app/views/admin/products_v3/_delete_modal.html.haml @@ -5,8 +5,8 @@ cancel_button_text: t("#{base_translation_key}.cancellation_text"), confirm_button_class: :red, actions_alignment_class: 'justify-end', - confirm_reflexes: "click->products#delete_#{object_type}", - confirm_actions: "click->modal#close", + controller: "products", + confirm_actions: "click->products#delete_#{object_type} click->modal#close", ) = render delete_modal do %h2.margin-bottom-20.black-text diff --git a/app/views/admin/products_v3/_edit_image.html.haml b/app/views/admin/products_v3/_edit_image.html.haml deleted file mode 100644 index 57fccaac764..00000000000 --- a/app/views/admin/products_v3/_edit_image.html.haml +++ /dev/null @@ -1,17 +0,0 @@ -= render ModalComponent.new id: "#modal_edit_product_image_#{image.id}", instant: true, close_button: false, modal_class: :fit do - %h2= t(".title") - - -# Display image in the same way it appears in the shopfront popup - %p= image_tag image.persisted? ? image.url(:large) : Spree::Image.default_image_url(:large), width: 433, height: 433 - - -# Submit to controller, because StimulusReflex doesn't support file uploads - = form_for [:admin, product, image], - html: { multipart: true }, data: { controller: "form" } do |f| - %input{ type: :hidden, name: :return_url, value: return_url} - = f.hidden_field :viewable_id, value: product.id - - .modal-actions.justify-end - %input{ class: "secondary relaxed", type: 'button', value: t('.close'), "data-action": "click->modal#close" } - -# label.button provides a handy shortcut to open the file selector on click. Unfortunately this trick isn't keyboard accessible though.. - = f.label :attachment, t(".upload"), class: "button primary relaxed icon-upload-alt" - = f.file_field :attachment, accept: "image/*", style: "display: none", "data-action": "change->form#submit" diff --git a/app/views/admin/products_v3/_filters.html.haml b/app/views/admin/products_v3/_filters.html.haml index 2a0aa554288..4b90628c7c5 100644 --- a/app/views/admin/products_v3/_filters.html.haml +++ b/app/views/admin/products_v3/_filters.html.haml @@ -1,6 +1,7 @@ = form_with url: admin_products_path, id: "filters", method: :get, data: { "search-target": "form", 'turbo-frame': "_self" } do = hidden_field_tag :page, nil, class: "page" = hidden_field_tag :per_page, nil, class: "per-page" + = hidden_field_tag '[q][s]', params.dig(:q, :s) || 'name asc', class: 'sort', 'data-default': 'name asc' .query .search-input diff --git a/app/views/admin/products_v3/_product_image.html.haml b/app/views/admin/products_v3/_product_image.html.haml new file mode 100644 index 00000000000..cc3e77d1416 --- /dev/null +++ b/app/views/admin/products_v3/_product_image.html.haml @@ -0,0 +1,3 @@ +%a.image-field{ href: product_image_form_path(product), 'data-turbo-stream': true } + = image_tag product.image&.url(:mini) || Spree::Image.default_image_url(:mini), width: 40, height: 40 + .button.secondary.mini= t('admin.products_page.image.edit') diff --git a/app/views/admin/products_v3/_product_row.html.haml b/app/views/admin/products_v3/_product_row.html.haml index 5e11301a5eb..48636dc92e3 100644 --- a/app/views/admin/products_v3/_product_row.html.haml +++ b/app/views/admin/products_v3/_product_row.html.haml @@ -1,15 +1,13 @@ -%td.with-image - %a.image-field{ href: admin_product_images_path(product), data: { controller: "modal", reflex: "click->products#edit_image", "current-id": product.id} } - = image_tag product.image&.url(:mini) || Spree::Image.default_image_url(:mini), width: 40, height: 40 - .button.secondary.mini= t('admin.products_page.image.edit') -%td.field.align-left.header.naked_inputs +%td.col-image.with-image{ id: "image-#{product.id}" } + = render partial: "product_image", locals: { product: } +%td.col-name.field.align-left.header.naked_inputs = f.hidden_field :id = f.text_field :name, 'aria-label': t('admin.products_page.columns.name') = error_message_on product, :name -%td.field.naked_inputs +%td.col-sku.field.naked_inputs = f.text_field :sku, 'aria-label': t('admin.products_page.columns.sku') = error_message_on product, :sku -%td.multi-field.naked_inputs{ 'data-controller': 'toggle-control', 'data-toggle-control-match-value': 'items' } +%td.col-unit_scale.field.naked_inputs{ 'data-controller': 'toggle-control', 'data-toggle-control-match-value': 'items' } = f.hidden_field :variant_unit = f.hidden_field :variant_unit_scale = f.select :variant_unit_with_scale, @@ -21,18 +19,23 @@ .field = f.text_field :variant_unit_name, 'aria-label': t('items'), 'data-toggle-control-target': 'control', style: (product.variant_unit == "items" ? "" : "display: none") = error_message_on product, :variant_unit_name, 'data-toggle-control-target': 'control' -%td.align-right +%td.col-unit.align-right -# empty -%td.align-right +%td.col-price.align-right -# empty -%td.align-right +%td.col-on_hand.align-right -# empty -%td.align-left - .content= product.supplier&.name -%td.align-left +%td.col-producer.naked_inputs + = render(SearchableDropdownComponent.new(form: f, + name: :supplier_id, + aria_label: t('.producer_field_name'), + options: producer_options, + selected_option: product.supplier_id, + placeholder_value: t('admin.products_v3.filters.search_for_producers'))) +%td.col-category.align-left -# empty -%td.align-left -%td.align-left +%td.col-tax_category.align-left +%td.col-inherits_properties.align-left .content= product.inherits_properties ? 'YES' : 'NO' #TODO: consider using https://github.com/RST-J/human_attribute_values, else use I18n.t (also below) %td.align-right = render(VerticalEllipsisMenu::Component.new) do @@ -40,5 +43,5 @@ = link_to t('admin.products_page.actions.clone'), clone_admin_product_path(product), 'data-turbo': false %a{ "data-controller": "modal-link", "data-action": "click->modal-link#setModalDataSetOnConfirm click->modal-link#open", "data-modal-link-target-value": "product-delete-modal", "class": "delete", - "data-modal-link-modal-dataset-value": {'data-current-id': product.id}.to_json } + "data-modal-link-modal-dataset-value": {'data-delete-path': admin_product_destroy_path(product)}.to_json } = t('admin.products_page.actions.delete') diff --git a/app/views/admin/products_v3/_sort.html.haml b/app/views/admin/products_v3/_sort.html.haml index f53eec4e76a..6749b3b07a4 100644 --- a/app/views/admin/products_v3/_sort.html.haml +++ b/app/views/admin/products_v3/_sort.html.haml @@ -1,5 +1,5 @@ #sort - %div + %div.pagination-description - if pagy.present? = t(".pagination.total_html", total: pagy.count, from: pagy.from, to: pagy.to) @@ -13,3 +13,6 @@ options_for_select([15, 25, 50, 100].collect{|i| [t('.pagination.per_page.per_page', num: i), i]}, pagy&.items), class: "no-input per-page", data: { controller: "tom-select search", action: "change->search#changePerPage", "tom-select-options-value": '{ "plugins": [] }'} + + / Columns dropdown + = render partial: "admin/column_preferences/form", locals: { action: "products_v3_index" } diff --git a/app/views/admin/products_v3/_table.html.haml b/app/views/admin/products_v3/_table.html.haml index 78d32be8b2c..0b8cc98b796 100644 --- a/app/views/admin/products_v3/_table.html.haml +++ b/app/views/admin/products_v3/_table.html.haml @@ -13,20 +13,21 @@ = hidden_field_tag :producer_id, @producer_id = hidden_field_tag :category_id, @category_id - %table.products + %table.products{ 'data-column-preferences-target': "table" } %colgroup - %col{ width:"56" }= # Img (size + padding) - %col= # (grow to fill) Name - %col{ width:"5%"} - %col{ width:"8%"} - %col{ width:"8%"} - %col{ width:"5%"} - %col{ width:"10%"} - %col{ width:"15%"}= # Producer - %col{ width:"8%"} - %col{ width:"8%"} - %col{ width:"8%"} - %col{ width:"8%"}= # Actions + -# The `min-width` property works in Chrome but not Firefox so is considered progressive enhancement. + %col.col-image{ width:"56px" }= # (image size + padding) + %col.col-name{ style:"min-width: 6em" }= # (grow to fill) + %col.col-sku{ width:"8%", style:"min-width: 6em" } + %col.col-unit_scale{ width:"8%" } + %col.col-unit{ width:"8%" } + %col.col-price{ width:"5%", style:"min-width: 5em" } + %col.col-on_hand{ width:"10%"} + %col.col-producer{ style:"min-width: 6em" }= # (grow to fill) + %col.col-category{ width:"8%" } + %col.col-tax_category{ width:"8%" } + %col.col-inherits_properties{ width:"5%" } + %col{ width:"5%", style:"min-width: 3em"}= # Actions %thead %tr %td.form-actions-wrapper{ colspan: 12 } @@ -48,35 +49,36 @@ = t('.reset') = form.submit t('.save'), class: "medium" %tr - %th.align-left= # image - %th.align-left.with-input= t('admin.products_page.columns.name') - %th.align-left.with-input= t('admin.products_page.columns.sku') - %th.align-left.with-input= t('admin.products_page.columns.unit_scale') - %th.align-left.with-input= t('admin.products_page.columns.unit') - %th.align-left.with-input= t('admin.products_page.columns.price') - %th.align-left.with-input= t('admin.products_page.columns.on_hand') - %th.align-left= t('admin.products_page.columns.producer') - %th.align-left= t('admin.products_page.columns.category') - %th.align-left= t('admin.products_page.columns.tax_category') - %th.align-left= t('admin.products_page.columns.inherits_properties') + %th.col-image.align-left= # image + = render partial: 'spree/admin/shared/stimulus_sortable_header', + locals: { column: :name, sorted: params.dig(:q, :s), default: 'name asc' } + %th.align-left.col-sku.with-input= t('admin.products_page.columns.sku') + %th.align-left.col-unit_scale.with-input= t('admin.products_page.columns.unit_scale') + %th.align-left.col-unit.with-input= t('admin.products_page.columns.unit') + %th.align-left.col-price.with-input= t('admin.products_page.columns.price') + %th.align-left.col-on_hand.with-input= t('admin.products_page.columns.on_hand') + %th.align-left.col-producer= t('admin.products_page.columns.producer') + %th.align-left.col-category= t('admin.products_page.columns.category') + %th.align-left.col-tax_category= t('admin.products_page.columns.tax_category') + %th.align-left.col-inherits_properties= t('admin.products_page.columns.inherits_properties') %th.align-right= t('admin.products_page.columns.actions') - products.each_with_index do |product, product_index| = form.fields_for("products", product, index: product_index) do |product_form| - %tbody.relaxed{ data: { 'record-id': product_form.object.id, + %tbody.relaxed{ id: dom_id(product), data: { 'record-id': product_form.object.id, controller: "nested-form product", - action: 'rails-nested-form:add->bulk-form#registerElements' } } + action: 'rails-nested-form:add->bulk-form#registerElements rails-nested-form:remove->bulk-form#toggleFormChanged' } } %tr - = render partial: 'product_row', locals: { product:, f: product_form } + = render partial: 'product_row', locals: { f: product_form, product:, producer_options: } - product.variants.each_with_index do |variant, variant_index| = form.fields_for("products][#{product_index}][variants_attributes][", variant, index: variant_index) do |variant_form| - %tr.condensed{ 'data-controller': "variant" } - = render partial: 'variant_row', locals: { variant:, f: variant_form } + %tr.condensed{ id: dom_id(variant), 'data-controller': "variant", 'class': "nested-form-wrapper", 'data-new-record': variant.new_record? ? "true" : false } + = render partial: 'variant_row', locals: { variant:, f: variant_form, category_options:, tax_category_options: } = form.fields_for("products][#{product_index}][variants_attributes][NEW_RECORD", product.variants.build) do |new_variant_form| %template{ 'data-nested-form-target': "template" } - %tr.condensed{ 'data-controller': "variant" } - = render partial: 'variant_row', locals: { variant: new_variant_form.object, f: new_variant_form } + %tr.condensed{ 'data-controller': "variant", 'class': "nested-form-wrapper", 'data-new-record': "true" } + = render partial: 'variant_row', locals: { variant: new_variant_form.object, f: new_variant_form, category_options:, tax_category_options: } %tr{ 'data-nested-form-target': "target" } %tr.condensed diff --git a/app/views/admin/products_v3/_variant_row.html.haml b/app/views/admin/products_v3/_variant_row.html.haml index 97646ec1ba1..311b833e041 100644 --- a/app/views/admin/products_v3/_variant_row.html.haml +++ b/app/views/admin/products_v3/_variant_row.html.haml @@ -1,15 +1,15 @@ -%td +%td.col-image -# empty -%td.field.naked_inputs +%td.col-name.field.naked_inputs = f.hidden_field :id = f.text_field :display_name, 'aria-label': t('admin.products_page.columns.name'), placeholder: variant.product.name = error_message_on variant, :display_name -%td.field.naked_inputs +%td.col-sku.field.naked_inputs = f.text_field :sku, 'aria-label': t('admin.products_page.columns.sku') = error_message_on variant, :sku -%td +%td.col-unit_scale -# empty -%td.field.popout{'data-controller': "popout", 'data-popout-update-display-value': "false"} +%td.col-unit.field.popout{'data-controller': "popout", 'data-popout-update-display-value': "false"} = f.button :unit_to_display, class: "popout__button", 'aria-label': t('admin.products_page.columns.unit'), 'data-popout-target': "button" do = variant.unit_to_display # Show the generated summary of unit values %div.popout__container{ style: 'display: none;', 'data-controller': 'toggle-control', 'data-popout-target': "dialog" } @@ -25,10 +25,10 @@ = f.label :display_as, t('admin.products_page.columns.display_as') = f.text_field :display_as, placeholder: VariantUnits::OptionValueNamer.new(variant).name = error_message_on variant, :unit_value -%td.field.naked_inputs +%td.col-price.field.naked_inputs = f.text_field :price, 'aria-label': t('admin.products_page.columns.price'), value: number_to_currency(variant.price, unit: '')&.strip # TODO: add a spec to prove that this formatting is necessary. If so, it should be in a shared form helper for currency inputs = error_message_on variant, :price -%td.field.popout{'data-controller': "popout"} +%td.col-on_hand.field.popout{'data-controller': "popout"} %button.popout__button{'data-popout-target': "button", 'aria-label': t('admin.products_page.columns.on_hand')} = variant.on_demand ? t(:on_demand) : variant.on_hand %div.popout__container{ style: 'display: none;', 'data-controller': 'toggle-control', 'data-popout-target': "dialog" } @@ -39,20 +39,35 @@ = f.label :on_demand do = f.check_box :on_demand, 'data-action': 'change->toggle-control#disableIfPresent change->popout#closeIfChecked' = t(:on_demand) -%td.align-left - .content= variant.product.supplier&.name # same as product -%td.align-left - .content= variant.primary_taxon&.name -%td.align-left - .content= (variant.tax_category_id ? variant.tax_category&.name : t('.none_tax_category')) # TODO: convert to dropdown -%td.align-left +%td.col-producer.align-left + -# empty producer name +%td.col-category.field.naked_inputs + = render(SearchableDropdownComponent.new(form: f, + name: :primary_taxon_id, + options: category_options, + selected_option: variant.primary_taxon_id, + aria_label: t('.category_field_name'), + placeholder_value: t('admin.products_v3.filters.search_for_categories'))) +%td.col-tax_category.field.naked_inputs + = render(SearchableDropdownComponent.new(form: f, + name: :tax_category_id, + options: tax_category_options, + selected_option: variant.tax_category_id, + include_blank: t('.none_tax_category'), + aria_label: t('.tax_category_field_name'), + placeholder_value: t('.search_for_tax_categories'))) + = error_message_on variant, :tax_category +%td.col-inherits_properties.align-left -# empty %td.align-right - - if variant.persisted? - = render(VerticalEllipsisMenu::Component.new) do + = render(VerticalEllipsisMenu::Component.new) do + - if variant.persisted? = link_to t('admin.products_page.actions.edit'), edit_admin_product_variant_path(variant.product, variant) - if variant.product.variants.size > 1 %a{ "data-controller": "modal-link", "data-action": "click->modal-link#setModalDataSetOnConfirm click->modal-link#open", "data-modal-link-target-value": "variant-delete-modal", "class": "delete", - "data-modal-link-modal-dataset-value": {'data-current-id': variant.id}.to_json } + "data-modal-link-modal-dataset-value": {'data-delete-path': admin_destroy_variant_path(variant)}.to_json } = t('admin.products_page.actions.delete') + - else + %a{ 'data-action': "nested-form#remove", class: 'delete' } + = t('admin.products_page.actions.remove') diff --git a/app/views/admin/products_v3/destroy_product_variant.turbo_stream.haml b/app/views/admin/products_v3/destroy_product_variant.turbo_stream.haml new file mode 100644 index 00000000000..645b265c410 --- /dev/null +++ b/app/views/admin/products_v3/destroy_product_variant.turbo_stream.haml @@ -0,0 +1,5 @@ +- # @record can either be Product or Variant +- unless flash[:error] + = turbo_stream.remove(dom_id(@record)) += turbo_stream.append "flashes" do + = render(partial: 'admin/shared/flashes', locals: { flashes: flash }) diff --git a/app/views/admin/products_v3/index.html.haml b/app/views/admin/products_v3/index.html.haml index 4200cd01768..668a8527a4b 100644 --- a/app/views/admin/products_v3/index.html.haml +++ b/app/views/admin/products_v3/index.html.haml @@ -15,8 +15,8 @@ = render partial: "content", locals: { products: @products, pagy: @pagy, search_term: @search_term, producer_options: producers, producer_id: @producer_id, category_options: categories, category_id: @category_id, - flashes: flash } + tax_category_options:, flashes: flash } - %w[product variant].each do |object_type| = render partial: 'delete_modal', locals: { object_type: } #modal-component - + #edit_image_modal diff --git a/app/views/admin/reports/_date_range_form.html.haml b/app/views/admin/reports/_date_range_form.html.haml index 0afa600caea..040344e6224 100644 --- a/app/views/admin/reports/_date_range_form.html.haml +++ b/app/views/admin/reports/_date_range_form.html.haml @@ -7,7 +7,8 @@ .row.date-range-filter .alpha.two.columns= label_tag nil, t(:date_range) .omega.fourteen.columns - = f.text_field "#{field}_gt", :class => 'datetimepicker datepicker-from', :placeholder => t(:start), data: { controller: "flatpickr", "flatpickr-enable-time-value": true, "flatpickr-default-date-value": "startOfDay" }, value: start_date - %span.range-divider - %i.icon-arrow-right - = f.text_field "#{field}_lt", :class => 'datetimepicker datepicker-to', :placeholder => t(:stop), data: { controller: "flatpickr", "flatpickr-enable-time-value": true, "flatpickr-default-date-value": "endOfDay" }, value: end_date + .field-block.omega.four.columns + .date-range-fields{ data: { controller: "flatpickr", "flatpickr-mode-value": "range", "flatpickr-enable-time-value": true , "flatpickr-default-hour": 0 } } + = text_field_tag nil, nil, class: "datepicker fullwidth", data: { "flatpickr-target": "instance", action: "flatpickr_clear@window->flatpickr#clear" } + = text_field_tag "q[#{field}_gt]", nil, data: { "flatpickr-target": "start" }, style: "display: none", value: start_date + = text_field_tag "q[#{field}_lt]", nil, data: { "flatpickr-target": "end" }, style: "display: none", value: end_date diff --git a/app/views/checkout/_details.html.haml b/app/views/checkout/_details.html.haml index b837e528128..56146d19c09 100644 --- a/app/views/checkout/_details.html.haml +++ b/app/views/checkout/_details.html.haml @@ -95,12 +95,7 @@ %div.checkout-input{"data-shippingmethod-target": "shippingMethodDescription", "data-shippingmethodid": shipping_method.id , style: "display: #{ship_method_is_selected ? 'block' : 'none'}" } #distributor_address.panel - if shipping_method.description.present? - %span #{shipping_method.description} - %br/ - %br/ - - if @order.order_cycle.pickup_time_for(@order.distributor) - = t :checkout_ready_for - = @order.order_cycle.pickup_time_for(@order.distributor) + = simple_format(html_escape(shipping_method.description)) = f.error_message_on :shipping_method, standalone: true diff --git a/app/views/checkout/_payment.html.haml b/app/views/checkout/_payment.html.haml index 656a246efe2..516d2025bb4 100644 --- a/app/views/checkout/_payment.html.haml +++ b/app/views/checkout/_payment.html.haml @@ -29,7 +29,7 @@ .paymentmethod-container{"data-paymentmethod-id": "#{payment_method.id}", style: "display: #{payment_method.id == selected_payment_method ? "block" : "none"}"} - if payment_method.description && !payment_method.description.empty? .paymentmethod-description.panel - #{payment_method.description} + = simple_format(html_escape(payment_method.description)) .paymentmethod-form = render partial: "checkout/payment/#{payment_method.method_type}", locals: { payment_method: payment_method, f: f } diff --git a/app/views/registration/steps/_details.html.haml b/app/views/registration/steps/_details.html.haml index 45fb0e56b7d..eee82d4ee38 100644 --- a/app/views/registration/steps/_details.html.haml +++ b/app/views/registration/steps/_details.html.haml @@ -57,7 +57,10 @@ %span.error{ "ng-show": "details.state.$error.required && submitted" } = t(".state_field_error") - = render 'registration/steps/location_map' if using_google_maps? + - if using_google_maps? + = render 'registration/steps/location_map_google' + - elsif ContentConfig.open_street_map_enabled + = render 'registration/steps/location_map_osm' .row.buttons .small-12.columns diff --git a/app/views/registration/steps/_location_map.html.haml b/app/views/registration/steps/_location_map_google.html.haml similarity index 100% rename from app/views/registration/steps/_location_map.html.haml rename to app/views/registration/steps/_location_map_google.html.haml diff --git a/app/views/registration/steps/_location_map_osm.html.haml b/app/views/registration/steps/_location_map_osm.html.haml new file mode 100644 index 00000000000..c60ffa74f7e --- /dev/null +++ b/app/views/registration/steps/_location_map_osm.html.haml @@ -0,0 +1,18 @@ +%div{ data: { + controller: "open-street-map", + "open-street-map-default-latitude-value": ContentConfig.open_street_map_default_latitude, + "open-street-map-default-longitude-value": ContentConfig.open_street_map_default_longitude, + "open-street-map-provider-name-value": ContentConfig.open_street_map_provider_name, + "open-street-map-provider-options-value": ContentConfig.open_street_map_provider_options + } + } + .center + %input.button.primary{ data: { action: "click->open-street-map#locateAddress" }, type: "button", value: "{{'registration.steps.details.locate_address' | t}}" } + .center{ data: { "open-street-map-target": "dragPinNote" }, style: "display: none" } + %strong {{'registration.steps.details.drag_pin' | t}} + #open-street-map.map-container--registration + + .center{ data: { "open-street-map-target": "confirmAddressField" }, style: "display: none" } + .field + %input{ type: 'checkbox', id: 'confirm_address', name: 'confirm_address', "ng-click": 'toggleAddressConfirmed()' } + %label{ for: 'confirm_address' } {{'registration.steps.details.confirm_address' | t}} diff --git a/app/views/shared/menu/_signed_in.html.haml b/app/views/shared/menu/_signed_in.html.haml index 34b7bcfc066..059580c1a24 100644 --- a/app/views/shared/menu/_signed_in.html.haml +++ b/app/views/shared/menu/_signed_in.html.haml @@ -1,9 +1,3 @@ -- if discourse_configured? - %li - %a{href: main_app.discourse_login_path, target: '_blank'} - %span.nav-primary - = t 'label_notices' - %li.user-menu.has-dropdown.not-click %a{href: "#", class: "top-bar--menu-item-with-icon"} diff --git a/app/views/shared/menu/_signed_in_offcanvas.html.haml b/app/views/shared/menu/_signed_in_offcanvas.html.haml index c6f0e6be8a9..e5ec28bef4f 100644 --- a/app/views/shared/menu/_signed_in_offcanvas.html.haml +++ b/app/views/shared/menu/_signed_in_offcanvas.html.haml @@ -1,10 +1,3 @@ -- if discourse_configured? - %li.li-menu - %a{href: main_app.discourse_login_path, target: '_blank'} - %span.nav-primary - %i.ofn-i_025-notepad - = t 'label_notices' - - if admin_user? or enterprise_user? %li %a{href: spree.admin_dashboard_path, target:'_blank'} diff --git a/app/views/spree/admin/images/edit.turbo_stream.haml b/app/views/spree/admin/images/edit.turbo_stream.haml new file mode 100644 index 00000000000..b3ca87329b2 --- /dev/null +++ b/app/views/spree/admin/images/edit.turbo_stream.haml @@ -0,0 +1,25 @@ += turbo_stream.update "edit_image_modal" do + = render ModalComponent.new id: "#modal_edit_product_image", instant: true, close_button: false, modal_class: :fit do + %h2= t(".title") + + -# Display image in the same way it appears in the shopfront popup + - if defined?(@errors) && !@errors.empty? + - @errors.each do |error| + %p + = error + - else + %p= image_tag @image.persisted? ? @image.url(:large) : Spree::Image.default_image_url(:large), width: 433, height: 433 + + + -# Submit as turbo stream to avoid full page reload. + -# TODO: show loading indicator. + = form_for [:admin, @product, @image], + html: { multipart: true }, data: { controller: "form" } do |f| + %input{ type: :hidden, name: :return_url, value: request.referer } + = f.hidden_field :viewable_id, value: @product.id + + .modal-actions.justify-end + %input{ class: "secondary relaxed", type: 'button', value: t('.close'), "data-action": "click->modal#close" } + -# label.button provides a handy shortcut to open the file selector on click. Unfortunately this trick isn't keyboard accessible though.. + = f.label :attachment, t(".upload"), class: "button primary relaxed icon-upload-alt" + = f.file_field :attachment, accept: "image/*", style: "display: none", "data-action": "change->form#submit change->modal#close" diff --git a/app/views/spree/admin/images/update.turbo_stream.haml b/app/views/spree/admin/images/update.turbo_stream.haml new file mode 100644 index 00000000000..169bf5c89ff --- /dev/null +++ b/app/views/spree/admin/images/update.turbo_stream.haml @@ -0,0 +1,3 @@ += turbo_stream.update "image-#{@product.id}" do + = render partial: "admin/products_v3/product_image", locals: { product: @product } + = render partial: "admin/shared/flashes", locals: { flashes: flash } if defined? flash diff --git a/app/views/spree/admin/orders/_form/_adjustments.html.haml b/app/views/spree/admin/orders/_form/_adjustments.html.haml index 5f3e9f215e0..771723c99e7 100644 --- a/app/views/spree/admin/orders/_form/_adjustments.html.haml +++ b/app/views/spree/admin/orders/_form/_adjustments.html.haml @@ -6,7 +6,7 @@ %tr %th= Spree.t('name') %th= Spree.t('amount') - %tbody.with-border + %tbody.with-border#order_adjustments - adjustments.each do |adjustment| %tr.total %td.strong= adjustment.label + ":" diff --git a/app/views/spree/admin/shared/_head.html.haml b/app/views/spree/admin/shared/_head.html.haml index 97336242ce2..cd1fa4cda34 100644 --- a/app/views/spree/admin/shared/_head.html.haml +++ b/app/views/spree/admin/shared/_head.html.haml @@ -7,7 +7,7 @@ - if content_for? :html_title = yield :html_title - else - = t(controller.controller_name, :default => controller.controller_name.titleize) + = t("spree.admin.tab.#{controller.controller_name}", :default => controller.controller_name.titleize) = " - OFN #{t(:administration)}" %link{:href => "https://fonts.googleapis.com/css?family=Open+Sans:400italic,600italic,400,600&subset=latin,cyrillic,greek,vietnamese", :rel => "stylesheet", :type => "text/css"} diff --git a/app/views/spree/admin/shared/_order_links.html.haml b/app/views/spree/admin/shared/_order_links.html.haml index 9af75fffd8a..a79cf3b2f51 100644 --- a/app/views/spree/admin/shared/_order_links.html.haml +++ b/app/views/spree/admin/shared/_order_links.html.haml @@ -19,3 +19,6 @@ %span=link[:name] = render 'spree/admin/shared/custom-confirm' +- if order_shipment_ready?(@order) + %form + = render ShipOrderComponent.new(order: @order) diff --git a/app/views/spree/admin/shared/_stimulus_sortable_header.html.haml b/app/views/spree/admin/shared/_stimulus_sortable_header.html.haml index 46443016ce2..051ffa1f4fa 100644 --- a/app/views/spree/admin/shared/_stimulus_sortable_header.html.haml +++ b/app/views/spree/admin/shared/_stimulus_sortable_header.html.haml @@ -1,5 +1,5 @@ -%th - %a{ "data-action": "click->search#changeSorting", "data-column": "#{column}", "data-current": sorted.to_s } +%th{ class: "col-#{column}" } + %a{ "data-controller": "search", "data-action": "click->search#changeSorting", "data-column": "#{column}", "data-current": (sorted || default).to_s } = t("spree.admin.shared.sortable_header.#{column.to_s}") - if sorted == "#{column} asc" || sorted.blank? && local_assigns[:default] == "#{column} asc" diff --git a/app/views/spree/admin/tax_settings/edit.html.haml b/app/views/spree/admin/tax_settings/edit.html.haml index 18f4c36aa92..9ba2c99880c 100644 --- a/app/views/spree/admin/tax_settings/edit.html.haml +++ b/app/views/spree/admin/tax_settings/edit.html.haml @@ -7,8 +7,9 @@ .field.align-center = hidden_field_tag 'preferences[products_require_tax_category]', '0' - = check_box_tag 'preferences[products_require_tax_category]', '1', Spree::Config[:products_require_tax_category] - = label_tag nil, t(:products_require_tax_category) + %label + = check_box_tag 'preferences[products_require_tax_category]', '1', Spree::Config[:products_require_tax_category] + = t(:products_require_tax_category) .form-buttons = button t(:update), 'icon-refresh' diff --git a/app/views/spree/admin/variants/_form.html.haml b/app/views/spree/admin/variants/_form.html.haml index 76a1ebfafc3..f90f15c1f7b 100644 --- a/app/views/spree/admin/variants/_form.html.haml +++ b/app/views/spree/admin/variants/_form.html.haml @@ -65,7 +65,7 @@ = f.number_field field, value: value, class: 'fullwidth', step: 0.01 .field - = f.label :tax_category_id, t(:tax_category) + = f.label :tax_category, t(:tax_category), for: :tax_category_id = f.collection_select(:tax_category_id, @tax_categories, :id, :name, { include_blank: t(:none) }, { class: 'select2 fullwidth' }) .field diff --git a/app/views/spree/orders/edit.html.haml b/app/views/spree/orders/edit.html.haml index fb50b995eb3..30811833b94 100644 --- a/app/views/spree/orders/edit.html.haml +++ b/app/views/spree/orders/edit.html.haml @@ -13,8 +13,6 @@ %strong - if @order.order_cycle = pickup_time @order.order_cycle - - else - = @order.distributor.next_collection_at - content_for :ordercycle_sidebar do .show-for-large-up.large-4.columns diff --git a/app/webpacker/controllers/application_controller.js b/app/webpacker/controllers/application_controller.js index 3065427cf43..50f5e57269e 100644 --- a/app/webpacker/controllers/application_controller.js +++ b/app/webpacker/controllers/application_controller.js @@ -47,7 +47,7 @@ export default class extends Controller { console.error(reflex + ":\n " + error); // show error message - alert(I18n.t("errors.stimulus_reflex_error")); + alert(I18n.t("errors.general_error.message")); } reflexForbidden(element, reflex, noop, reflexId) { diff --git a/app/webpacker/controllers/bulk_form_controller.js b/app/webpacker/controllers/bulk_form_controller.js index 602f7c0127e..bd1ab3b8545 100644 --- a/app/webpacker/controllers/bulk_form_controller.js +++ b/app/webpacker/controllers/bulk_form_controller.js @@ -63,7 +63,7 @@ export default class BulkFormController extends Controller { // For each record, check if any fields are changed // TODO: optimise basd on current state. if field is changed, but form already changed, no need to update (and vice versa) const changedRecordCount = Object.values(this.recordElements).filter((elements) => - elements.some(this.#isChanged), + elements.some(this.#checkIsChanged.bind(this)), ).length; this.formChanged = changedRecordCount > 0 || this.errorValue; @@ -131,14 +131,32 @@ export default class BulkFormController extends Controller { }); } + // Check if changed, and mark with class if it is. + #checkIsChanged(element) { + if(!element.isConnected) return false; + + const changed = this.#isChanged(element); + element.classList.toggle("changed", changed); + return changed; + } + #isChanged(element) { - if (element.type == "checkbox") { + if (element.type == "checkbox") { return element.defaultChecked !== undefined && element.checked != element.defaultChecked; + } else if (element.type == "select-one") { + // (weird) Behavior of select element's include_blank option in Rails: + // If a select field has include_blank option selected (its value will be ''), + // its respective option doesn't have the selected attribute + // but selectedOptions have that option present const defaultSelected = Array.from(element.options).find((opt) => opt.hasAttribute("selected"), ); - return element.selectedOptions[0] != defaultSelected; + const selectedOption = element.selectedOptions[0]; + const areBothBlank = selectedOption.value === '' && defaultSelected === undefined + + return !areBothBlank && selectedOption !== defaultSelected; + } else { return element.defaultValue !== undefined && element.value != element.defaultValue; } diff --git a/app/webpacker/controllers/column_preferences_controller.js b/app/webpacker/controllers/column_preferences_controller.js new file mode 100644 index 00000000000..9b55a961dc2 --- /dev/null +++ b/app/webpacker/controllers/column_preferences_controller.js @@ -0,0 +1,43 @@ +import { Controller } from "stimulus"; + +// Manage column visibility according to checkbox selection +// +export default class ColumnPreferencesController extends Controller { + connect() { + this.table = document.querySelector('table[data-column-preferences-target="table"]'); + this.cols = Array.from(this.table.querySelectorAll('col')); + this.colSpanCells = this.table.querySelectorAll('th[colspan],td[colspan]'); + // Initialise data-default-col-span + this.colSpanCells.forEach((cell)=> { + cell.dataset.defaultColSpan ||= cell.colSpan; + }); + + this.checkboxes = Array.from(this.element.querySelectorAll("input[type=checkbox]")); + for (const element of this.checkboxes) { + // On initial load + this.#showHideColumn(element); + // On checkbox changed + element.addEventListener("change", this.#showHideColumn.bind(this)); + } + } + + // private + + #showHideColumn(e) { + const element = e.target || e; + const name = element.dataset.columnName; + + this.table.classList.toggle(`hide-${name}`, !element.checked); + + // Reset cell colspans + const hiddenColCount = this.checkboxes.filter((checkbox)=> !checkbox.checked).length; + for(const cell of this.colSpanCells) { + const span = parseInt(cell.dataset.defaultColSpan, 10) - hiddenColCount; + cell.colSpan = span; + }; + } + + #showHideElement(element, show) { + element.style.display = show ? "" : "none"; + } +} diff --git a/app/webpacker/controllers/dropdown_controller.js b/app/webpacker/controllers/dropdown_controller.js index 844289e12c1..701fdf27a78 100644 --- a/app/webpacker/controllers/dropdown_controller.js +++ b/app/webpacker/controllers/dropdown_controller.js @@ -1,5 +1,6 @@ import { Controller } from "stimulus"; +// Close a
element when click outside export default class extends Controller { connect() { diff --git a/app/webpacker/controllers/form_controller.js b/app/webpacker/controllers/form_controller.js index aaac9db4ecf..54354d340f5 100644 --- a/app/webpacker/controllers/form_controller.js +++ b/app/webpacker/controllers/form_controller.js @@ -2,6 +2,8 @@ import { Controller } from "stimulus"; export default class FormController extends Controller { submit() { - this.element.submit(); + // Validate and submit the form, using the default submit button. Raises JS events. + // Ref: https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/requestSubmit + this.element.requestSubmit(); } } diff --git a/app/webpacker/controllers/open_street_map_controller.js b/app/webpacker/controllers/open_street_map_controller.js new file mode 100644 index 00000000000..38103565df1 --- /dev/null +++ b/app/webpacker/controllers/open_street_map_controller.js @@ -0,0 +1,108 @@ +import { Controller } from "stimulus"; +import L from "leaflet"; +import LeafetProviders from "leaflet-providers"; +import { OpenStreetMapProvider } from 'leaflet-geosearch'; + +export default class extends Controller { + static targets = ["confirmAddressField", "dragPinNote"]; + static values = { + defaultLatitude: Number, + defaultLongitude: Number, + providerName: String, + providerOptions: Object + }; + + connect() { + this.zoomLevel = 6; + this.#displayMapWhenAtRegistrationDetailsStep(); + } + + disconnect() { + this.map.remove(); + } + + async locateAddress() { + const results = await this.provider.search({ query: this.#addressQuery() }); + if(results.length > 0) { + const result = results[0]; + this.#setLatitudeLongitude(result.y, result.x); + this.#addMarker(result.y, result.x); + this.map.setView([result.y, result.x], this.zoomLevel); + this.confirmAddressFieldTarget.style.display = "block"; + this.dragPinNoteTarget.style.display = "block"; + } + } + + #addressQuery() { + const stateField = document.getElementById("enterprise_state"); + const state = stateField.options[stateField.selectedIndex]?.label; + const countryField = document.getElementById("enterprise_country"); + const country = countryField.options[countryField.selectedIndex]?.label; + const city = document.getElementById("enterprise_city")?.value; + const zipcode = document.getElementById("enterprise_zipcode")?.value; + const addressLine1 = document.getElementById("enterprise_address")?.value; + const addressLine2 = document.getElementById("enterprise_address2")?.value; + + // If someone clicks the locate address on map button without filling in their address the + // geocoded address will not be very accurate so don't zoom in too close so it's easier for + // people to see where the marker is. + if(!addressLine1 && !city && !zipcode) { + this.zoomLevel = 6; + } else { + this.zoomLevel = 14; + } + + return [addressLine1, addressLine2, city, state, zipcode, country].filter((value) => !!value).join(", ") + } + + #addMarker(latitude, longitude) { + const icon = L.icon({ iconUrl: "/map_icons/map_003-producer-shop.svg" }); + this.marker = L.marker([latitude, longitude], { + draggable: true, + icon: icon, + }); + + this.marker.on("dragend", (event) => { + const position = event.target.getLatLng(); + this.#setLatitudeLongitude(position.lat, position.lng); + }); + + this.marker.addTo(this.map); + } + + #displayMap() { + // Don't initialise map in test environment because that could possibly abuse OSM tile servers + if(process.env.RAILS_ENV == "test") { + return false; + } + + this.map = L.map('open-street-map') + L.tileLayer.provider(this.providerNameValue, this.providerOptionsValue).addTo(this.map) + this.map.setView([this.defaultLatitudeValue, this.defaultLongitudeValue], this.zoomLevel) + this.provider = new OpenStreetMapProvider(); + } + + // The connect() method is called before the registration details step is visible, this + // causes the map tiles to render incorrectly. To fix this only display the map when the + // registration details step has been reached. + #displayMapWhenAtRegistrationDetailsStep() { + const observer = new IntersectionObserver( + ([intersectionObserverEntry]) => { + if(intersectionObserverEntry.target.offsetParent !== null) { + this.#displayMap(); + observer.disconnect() + } + }, + { threshold: [0] } + ); + observer.observe(document.getElementById("registration-details")); + } + + // The registration process uses Angular, set latitude and longitude data properties so the + // Angular RegistrationCtrl controller can read and add them to the parameters it uses to create + // new enterprises. + #setLatitudeLongitude(latitude, longitude) { + document.getElementById("open-street-map").dataset.latitude = latitude; + document.getElementById("open-street-map").dataset.longitude = longitude; + } +} diff --git a/app/webpacker/controllers/products_controller.js b/app/webpacker/controllers/products_controller.js index 9ec3ac1a865..720b1813827 100644 --- a/app/webpacker/controllers/products_controller.js +++ b/app/webpacker/controllers/products_controller.js @@ -17,6 +17,14 @@ export default class extends ApplicationController { this.hideLoading(); } + delete_product() { + this.#deleteByRecordType('product'); + } + + delete_variant() { + this.#deleteByRecordType('variant'); + } + showLoading = () => { if (this.getLoadingController()) { this.getLoadingController().showLoading(); @@ -39,4 +47,46 @@ export default class extends ApplicationController { "loading" )); }; + + // +recordType+ can either be 'product' or 'variant' + #deleteByRecordType(recordType) { + const deletePath = document.querySelector(`#${recordType}-delete-modal #modal-confirm-button`).getAttribute('data-delete-path'); + const elementToBeRemoved = this.#getElementToBeRemoved(deletePath, recordType); + + const handleSlideOutAnimationEnd = async () => { + // in case of test env, we won't be having csrf token + const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content'); + + try { + const response = await fetch(deletePath, { + method: 'DELETE', + headers: { + Accept: 'text/vnd.turbo-stream.html', + 'X-CSRF-Token': csrfToken, + } + }); + // need to render the turboStream message, that's why not throwing error here + if(response.status === 500) elementToBeRemoved.classList.remove('slide-out'); + + const responseTurboStream = await response.text(); + Turbo.renderStreamMessage(responseTurboStream); + } catch(error) { + console.error(error.message); + elementToBeRemoved.classList.remove('slide-out'); + } + finally { + elementToBeRemoved.removeEventListener('animationend', handleSlideOutAnimationEnd); + } + }; + + elementToBeRemoved.classList.add('slide-out'); + elementToBeRemoved.addEventListener('animationend', handleSlideOutAnimationEnd); + }; + + #getElementToBeRemoved(path, recordType) { + const recordId = path.substring(path.lastIndexOf('/') + 1); + const elementDomId = `${recordType}_${recordId}`; + + return document.getElementById(elementDomId); + }; } diff --git a/app/webpacker/css/admin/components/input.scss b/app/webpacker/css/admin/components/input.scss index 1c1a847e567..2b390bce6d1 100644 --- a/app/webpacker/css/admin/components/input.scss +++ b/app/webpacker/css/admin/components/input.scss @@ -6,32 +6,3 @@ } } } - -input[type="checkbox"].redesigned-input { - position: relative; - top: 1px; - -moz-appearance: none; - -webkit-appearance: none; - -o-appearance: none; - appearance: none; - outline: none; - content: none; - cursor: pointer; - - &:before { - font-family: "FontAwesome"; - content: "\f00c"; - font-size: 15px; - color: transparent !important; - background: transparent !important; - display: block; - width: 15px; - height: 15px; - border: 1px solid #809cb1; - margin-right: 7px; - } - - &:checked:before { - color: $color-txt-text !important; - } -} diff --git a/app/webpacker/css/admin/products_v3.scss b/app/webpacker/css/admin/products_v3.scss index 8cb8ccbce2d..576e6d8af14 100644 --- a/app/webpacker/css/admin/products_v3.scss +++ b/app/webpacker/css/admin/products_v3.scss @@ -96,7 +96,8 @@ // "Naked" inputs. Row hover helps reveal them. .naked_inputs { - input:not([type="checkbox"]), .ts-control { + input:not([type="checkbox"]), + .ts-control { background-color: $color-tbl-cell-bg; } } @@ -170,16 +171,27 @@ .field { padding: 0; } - .multi-field { - // Allow wrap with small gap - display: flex; - flex-wrap: wrap; - gap: 3px; + + .fullwidth + .field { + // Assume wrap, so add small gap + margin-top: 3px; } .ts-control { z-index: 0; // Avoid hovering over thead } + + // Hide columns + $columns: + "image", "name", "sku", "unit_scale", "unit", "price", "on_hand", "producer", "category", + "tax_category", "inherits_properties"; + @each $col in $columns { + &.hide-#{$col} { + .col-#{$col} { + display: none; + } + } + } } #no-products { @@ -215,6 +227,10 @@ display: none; } + .pagination-description { + flex-grow: 1; // Grow to fill space + } + .with-dropdown { display: flex; justify-content: space-between; @@ -222,7 +238,11 @@ gap: 10px; } .per-page { - width: 10em; + width: 9em; + } + + .column-preferences .ofn-drop-down-label { + width: 13em; } } @@ -371,7 +391,7 @@ border-radius: $border-radius; box-shadow: 0px 0px 8px 0px rgba($near-black, 0.25); - .field{ + .field { margin-bottom: 0.75em; &:last-child { @@ -414,4 +434,19 @@ } } } + + @keyframes slideOutLeft { + from { + transform: translateX(0); + opacity: 1; + } + to { + transform: translateX(-100%); + opacity: 0; + } + } + + .slide-out { + animation: slideOutLeft 0.5s forwards; + } } diff --git a/app/webpacker/css/admin_v3/components/dropdown.scss b/app/webpacker/css/admin_v3/components/dropdown.scss index 8a101d1c8d9..6f8bd99c8a4 100644 --- a/app/webpacker/css/admin_v3/components/dropdown.scss +++ b/app/webpacker/css/admin_v3/components/dropdown.scss @@ -101,8 +101,6 @@ > span { width: auto; - text-transform: uppercase; - font-size: 85%; font-weight: 600; } @@ -113,7 +111,7 @@ top: 100%; left: 0px; padding: 5px 0px; - border: 1px solid #adadad; + border-radius: $border-radius; background-color: #ffffff; box-shadow: 1px 3px 10px #888888; z-index: 100; @@ -181,6 +179,25 @@ } } + summary:after { + content: "\f078"; + font-family: FontAwesome; + position: relative; + top: 3px; + font-size: 13px; + } + + + &[open] >, + details[open] > { + summary:after { + content: "\f077"; + font-family: FontAwesome; + } + } +} + +.ofn-drop-down:not(.ofn-dropdown-v2) { > details { margin: -7px -15px; padding: 7px 15px; @@ -190,21 +207,14 @@ display: inline-block; list-style: none; width: auto; - text-transform: uppercase; - font-size: 85%; - font-weight: 600; margin: -8px -15px; padding: 8px 15px; - } - - > details > summary:after { - content: "\f0d7"; - font-family: FontAwesome; - } - > details[open] > summary:after { - content: "\f0d8"; - font-family: FontAwesome; + &:after { + position: relative; + top: -1px; + font-size: 12px; + } } } @@ -212,8 +222,11 @@ border: 1px solid $lighter-grey; background-color: $lighter-grey; padding: 0px; + line-height: normal; + @include border-radius($border-radius); - &:hover { + &:hover, + &.expanded { border-color: $lighter-grey; } @@ -263,17 +276,22 @@ cursor: pointer; padding-top: 4px; padding-bottom: 5px; - text-transform: uppercase; - font-size: 85%; + font-size: inherit; + + // Align checkbox and text + & > * { + vertical-align: middle; + } } } -} -.ofn-drop-down.ofn-drop-down-v2 { - // Add very specific styling here for components that are in transition: - // ie. the ones using the two classes above - .ofn-drop-down-label { - padding-top: 7px; - padding-bottom: 7px; + .actions { + margin-top: 5px; + margin-right: 15px; // Compensate for scrollbar on menu_items + padding: 2px 10px; + + &:hover { + background-color: inherit; + } } } diff --git a/app/webpacker/css/admin_v3/components/tom_select.scss b/app/webpacker/css/admin_v3/components/tom_select.scss index ddae48cd71c..5f0eb481e21 100644 --- a/app/webpacker/css/admin_v3/components/tom_select.scss +++ b/app/webpacker/css/admin_v3/components/tom_select.scss @@ -194,6 +194,13 @@ } } +// Errors +.field_with_errors .ts-wrapper { + .ts-control { + border-color: $color-error; + } +} + // Display as "changed" if sibling select is marked as changed. select.changed + .ts-wrapper { &.single, &.multi { diff --git a/app/webpacker/js/turbo.js b/app/webpacker/js/turbo.js new file mode 100644 index 00000000000..4451810c939 --- /dev/null +++ b/app/webpacker/js/turbo.js @@ -0,0 +1,14 @@ +import "@hotwired/turbo"; + +document.addEventListener("turbo:frame-missing", (event) => { + // don't replace frame contents + event.preventDefault(); + + // show error message instead + status = event.detail.response.status; + if(status == 401) { + alert(I18n.t("errors.unauthorized.message")); + } else { + alert(I18n.t("errors.general_error.message")); + } +}); diff --git a/app/webpacker/packs/admin.js b/app/webpacker/packs/admin.js index 81735d3040d..dbb68bafc29 100644 --- a/app/webpacker/packs/admin.js +++ b/app/webpacker/packs/admin.js @@ -1,6 +1,6 @@ import "controllers"; import "channels"; -import "@hotwired/turbo"; +import "../js/turbo"; import "../js/hotkeys"; import "../js/mrujs"; import "../js/matomo"; @@ -17,3 +17,4 @@ import Trix from "trix"; document.addEventListener("trix-file-accept", (event) => { event.preventDefault(); }); + diff --git a/app/webpacker/packs/application.js b/app/webpacker/packs/application.js index 5ee6a3b0660..f8263d1830a 100644 --- a/app/webpacker/packs/application.js +++ b/app/webpacker/packs/application.js @@ -1,5 +1,5 @@ import "controllers"; -import "@hotwired/turbo"; +import "../js/turbo"; import "../js/hotkeys"; import "../js/mrujs"; import "../js/matomo"; diff --git a/config/initializers/flipper.rb b/config/initializers/flipper.rb index 4a4aecaf259..446ac3ee703 100644 --- a/config/initializers/flipper.rb +++ b/config/initializers/flipper.rb @@ -2,8 +2,23 @@ require "flipper/adapters/active_record" require "open_food_network/feature_toggle" -Flipper.register(:admins) { |actor| actor.respond_to?(:admin?) && actor.admin? } +Rails.application.configure do + # Disable Flipper's built-in test helper. + # It fails in CI and feature don't get activated. + config.flipper.test_help = false +end + +Flipper.configure do |flipper| + # Still use recommended test setup with faster memory adapter: + if Rails.env.test? + # Use a shared Memory adapter for all tests. The adapter is instantiated + # outside of the block so the same instance is returned in new threads. + adapter = Flipper::Adapters::Memory.new + flipper.adapter { adapter } + end +end +Flipper.register(:admins) { |actor| actor.respond_to?(:admin?) && actor.admin? } Flipper::UI.configure do |config| config.descriptions_source = ->(_keys) do # return has to be hash of {String key => String description} diff --git a/config/locales/ar.yml b/config/locales/ar.yml index be4307484d6..c8b774b0704 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -477,6 +477,7 @@ ar: edit: تعديل clone: استنساخ delete: حذف + remove: إزالة image: edit: تعديل adjustments: @@ -706,8 +707,12 @@ ar: clear_search: مسح البحث table: new_variant: نوع جديد - edit_image: - close: عودة + variant_row: + none_tax_category: لا شيء + category_field_name: "الفئة" + tax_category_field_name: "الفئة الضريبية" + product_row: + producer_field_name: "المنتج" product_import: title: استيراد المنتج file_not_found: لم يتم العثور على الملف أو تعذر فتحه @@ -1127,7 +1132,16 @@ ar: add_new: اضف جديد no_voucher_yet: لا قسائم حتى الآن connected_apps: + tagline: "By clicking ‘Allow data sharing’, you are sharing data between Open Food Network and the Discover Regenerative Portal, and agreeing to make specific data public on the Portal, which will also be publicly available on the API.\nIMPORTANT: Before you stop sharing and remove your listing, please first contact hello@regenerative.org.au to request a copy of your Discover Regenerative data." loading: "جار التحميل" + description_html: | +

+ Discover Regenerative is a showcase of Australia’s Regenerative Farmers, their produce/products, outcomes and achievements. It simplifies how business-to-business (B2B) / wholesale buyers can find regenerative produce and directly connect with Producers. +

+

+ Visit Discover Regenerative + +

actions: edit_profile: الإعدادات properties: الخصائص @@ -1881,7 +1895,6 @@ ar: label_account: "الحساب" label_more: "أظهر المزيد" label_less: "عرض أقل" - label_notices: "إشعارات" cart_items: "العناصر" cart_headline: "سلة التسوق الخاصة بك" total: "مجموع" @@ -3828,6 +3841,9 @@ ar: validation: must_be_int: "يجب أن يكون رقما صحيحا" admin: + images: + edit: + close: عودة mail_methods: send_testmail: "إرسال بريد إلكتروني تجريبي" testmail: @@ -3855,6 +3871,10 @@ ar: customers: "العملاء" groups: "مجموعات" oidc_settings: "إعدادات OIDC" + overview: "نظرة عامة" + product_import: "استيراد" + enterprise_roles: "الأدوار" + payment_methods: "طرق الدفع" product_properties: index: inherits_properties_checkbox_hint: "وراثة الخصائص من %{supplier}؟ (ما لم يتم تجاوزه أعلاه)" diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 1522484fc1e..4a1c94853e2 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -108,7 +108,8 @@ ca: message_html: "Si us plau, torna a provar

Pot ser un problema temporal. Si us plau, clica al botó de tornar enrere per a tornar a la pantalla anterior o torna a l'Inici i prova una altra vegada.

Ho estem intentant

Si has vist aquest problema abans, probablement ja estem assabentats i estem treballant per a solucionar-lo. Registrem tots els errors que apareixen.

Contacte de suport

Si el problema persisteix o és urgent, si us plau informa'ns. Busca com fer-ho a la pàgina Open Food Network Local.

Ens ajuda molt que ens proporcionis tants detalls com sigui possible de què estaves fent quan es va aparèixer aquest error.

" unprocessable_entity: message_html: "

El canvi que volies va ser rebutjat. Potser heu intentat canviar alguna cosa a la qual no teniu accés.

Tornar a l'inici

" - stimulus_reflex_error: "Ens sap greu, però alguna cosa ha anat malament.\n\n Pot ser que sigui un problema temporal, així que si us plau, torna-ho a provar o torna a carregar la pàgina.\n Enregistrem tots els errors i és possible que estiguem treballant en una solució.\n Si el problema persisteix o és urgent, poseu-vos en contacte amb nosaltres." + general_error: + message: "Ens sap greu, però alguna cosa ha anat malament.\n\n Pot ser que sigui un problema temporal, així que si us plau, torna-ho a provar o torna a carregar la pàgina.\n Enregistrem tots els errors i és possible que estiguem treballant en una solució.\n Si el problema persisteix o és urgent, poseu-vos en contacte amb nosaltres." stripe: error_code: incorrect_number: "El número de la targeta és incorrecte." @@ -504,6 +505,7 @@ ca: edit: Editar clone: Clonar delete: Suprimir + remove: Eliminar image: edit: Editar adjustments: @@ -725,6 +727,7 @@ ca: index: header: title: Edició de productes en bloc + content: loading: Carregant els vostres productes delete_modal: delete_product_modal: @@ -770,8 +773,12 @@ ca: new_variant: Nova variant bulk_update: success: Canvis guardats - edit_image: - close: Enrere + variant_row: + none_tax_category: Cap + category_field_name: "Categoria" + tax_category_field_name: "Categoria d'impostos" + product_row: + producer_field_name: "Productora" product_import: title: Importació de productes file_not_found: No s'ha trobat el fitxer o no s'ha pogut obrir @@ -1897,7 +1904,6 @@ ca: label_account: "Compte" label_more: "Mostrar més" label_less: "Mostra menys" - label_notices: "Avisos" cart_items: "articles" cart_headline: "La teva cistella" total: "Total" @@ -3710,6 +3716,9 @@ ca: validation: must_be_int: "ha de ser un nombre enter" admin: + images: + edit: + close: Enrere mail_methods: send_testmail: "Enviar correu electrònic de prova" testmail: @@ -3736,6 +3745,10 @@ ca: enterprise_relationships: "Permisos" customers: "Consumidores" groups: "Grups" + overview: "Visió general" + product_import: "Importa" + enterprise_roles: "Rols" + payment_methods: "Mètodes de Pagament" product_properties: index: inherits_properties_checkbox_hint: "heredar propietats de %{supplier}? (llevat que es sobreescrigui a dalt)" diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 2d774a500f9..f6c7a9260e5 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -137,7 +137,8 @@ cy: unprocessable_entity: title: "Gwrthodwyd y newid roeddech chi am ei wneud (422)" message_html: "

Gwrthodwyd y newid roeddech chi am ei wneud. Hwyrach ichi geisio newid rhywbeth nad oes gennych fynediad ato.

Ewch yn ôl i’r Hafan.

" - stimulus_reflex_error: "Mae’n ddrwg gennym, ond aeth rhywbeth o’i le. \n\nGall fod yn broblem dros dro, felly gofynnir ichi roi cynnig arall neu ail-lwytho’r dudalen.\n Byddwn yn cofnodi pob gwall, a hwyrach ein bod yn gweithio i’w datrys. \nOs bydd y broblem yn parhau, neu os taw mater brys yw, cysylltwch â ni." + general_error: + message: "Mae’n ddrwg gennym, ond aeth rhywbeth o’i le. \n\nGall fod yn broblem dros dro, felly gofynnir ichi roi cynnig arall neu ail-lwytho’r dudalen.\n Byddwn yn cofnodi pob gwall, a hwyrach ein bod yn gweithio i’w datrys. \nOs bydd y broblem yn parhau, neu os taw mater brys yw, cysylltwch â ni." stripe: error_code: incorrect_number: "Mae rhif y cerdyn yn anghywir" @@ -534,6 +535,7 @@ cy: edit: Golygu clone: Clôn delete: Dileu + remove: Dileu image: edit: Golygu adjustments: @@ -755,6 +757,7 @@ cy: index: header: title: Cynhyrchion Golygu Swmp + content: loading: Yn llwytho eich cynnyrch delete_modal: delete_product_modal: @@ -802,16 +805,18 @@ cy: new_variant: Amrywiolyn newydd bulk_update: success: Cadwyd y newidiadau - edit_image: - title: Golygu llun y cynnyrch - close: Yn ôl - upload: Lanlwytho llun delete_product: success: Llwyddwyd i ddileu’r cynnyrch error: Yn methu dileu’r cynnyrch delete_variant: success: Llwyddwyd i ddileu’r amrywiolyn error: Yn methu dileu’r amrywiolyn + variant_row: + none_tax_category: Dim + category_field_name: "Categori" + tax_category_field_name: "Categori Treth" + product_row: + producer_field_name: "Cynhyrchydd" product_import: title: Mewnforio Cynnyrch file_not_found: Ni ddaethpwyd o hyd i ffeil neu ni ellid ei hagor @@ -2030,7 +2035,6 @@ cy: label_account: "Cyfrif" label_more: "Dangos mwy" label_less: "Dangos llai" - label_notices: "Hysbysiadau" cart_items: "eitemau" cart_headline: "Eich troli siopa" total: "Cyfanswm" @@ -3951,6 +3955,11 @@ cy: validation: must_be_int: "mae'n rhaid cael cyfanrif" admin: + images: + edit: + title: Golygu llun y cynnyrch + close: Yn ôl + upload: Lanlwytho llun mail_methods: send_testmail: "Anfon ebost prawf" testmail: @@ -3978,6 +3987,10 @@ cy: customers: "Cwsmeriaid" groups: "Grwpiau" oidc_settings: "OIDC Settings" + overview: "Trosolwg" + product_import: "Mewnforio" + enterprise_roles: "Rolau" + payment_methods: "Dulliau Talu" product_properties: index: inherits_properties_checkbox_hint: "Etifeddu eiddo gan %{supplier}? (oni bai ei fod yn cael ei ddiystyru uchod)" diff --git a/config/locales/de_CH.yml b/config/locales/de_CH.yml index 64385cd440c..4417189b699 100644 --- a/config/locales/de_CH.yml +++ b/config/locales/de_CH.yml @@ -471,6 +471,7 @@ de_CH: edit: Bearbeiten clone: Duplizieren delete: Löschen + remove: Löschen image: edit: Bearbeiten adjustments: @@ -697,8 +698,12 @@ de_CH: no_products_found: Keine Produkte gefunden. table: new_variant: Neue Produktvariante - edit_image: - close: Zurück + variant_row: + none_tax_category: Keine + category_field_name: "Kategorie" + tax_category_field_name: "Steuerkategorie" + product_row: + producer_field_name: "Produzent" product_import: title: Produkte importieren file_not_found: Die Datei konnte nicht gefunden oder nicht geöffnet werden. @@ -1099,6 +1104,7 @@ de_CH: email_confirmed: "E-Mail-Adresse bestätigt" email_not_confirmed: "E-Mail-Adresse nicht bestätigt" vouchers: + voucher_code: Gutschein-Code rate: Steuersatz customers: Kunde active: Aktiv? @@ -1534,6 +1540,7 @@ de_CH: new: back: Zurück save: Speichern + voucher_code: Gutschein-Code voucher_amount: Betrag controllers: enterprises: @@ -1619,6 +1626,10 @@ de_CH: explaination: Sie können Ihre Bestellung im nächsten Schritt überprüfen und die endgültigen Kosten bestätigen. submit: Weiter - Bestellübersicht cancel: Zurück - Ihre Daten + voucher: + apply_voucher: Gutschein einlösen + apply: Einlösen + placeholder: Gutschein-Code eingeben step3: delivery_details: title: Lieferdetails @@ -1729,6 +1740,7 @@ de_CH: abn: "MWST nr." acn: "St.-Nr.:" invoice_issued_on: "Rechnungsdatum:" + order_number: "Bestellnummer:" date_of_transaction: "Bestelldatum:" menu_1_title: "Einkaufen" menu_1_url: "/shops" @@ -1811,7 +1823,6 @@ de_CH: label_account: "Konto" label_more: "Mehr anzeigen" label_less: "Weniger anzeigen" - label_notices: "Ankündigungen" cart_items: "Artikel" cart_headline: "Ihr Warenkorb" total: "Summe" @@ -2684,6 +2695,7 @@ de_CH: report_header_total_tax: "Summe Steuern (%{currency_symbol})" report_header_total_excl_tax: "Summe exkl. Steuern (%{currency_symbol})" report_header_total_incl_tax: "Summe inkl. Steuern (%{currency_symbol})" + report_header_total_orders: "Anzahl der Bestellungen" report_header_enterprise: Unternehmen report_header_enterprise_fee_name: Name report_header_enterprise_fee_type: Art @@ -3632,6 +3644,9 @@ de_CH: validation: must_be_int: "muss eine ganze Zahl sein" admin: + images: + edit: + close: Zurück mail_methods: send_testmail: "Test-E-Mail senden" testmail: @@ -3658,6 +3673,10 @@ de_CH: enterprise_relationships: "Berechtigungen" customers: "Kunden" groups: "Gruppen" + overview: "Einführung" + product_import: "Importieren" + enterprise_roles: "Rollen" + payment_methods: "Zahlungsarten" product_properties: index: inherits_properties_checkbox_hint: "Übernahme der Eigenschaften von %{supplier} (ausser oben überschrieben)?" @@ -3747,6 +3766,7 @@ de_CH: from: "Von" to: "Rechnungsempfänger" shipping: "Lieferung" + order_number: "Bestellnummer" payments_list: date_time: "Datum/Uhrzeit" payment_method: "Zahlungsart" diff --git a/config/locales/de_DE.yml b/config/locales/de_DE.yml index fde7a15eb12..de859639d50 100644 --- a/config/locales/de_DE.yml +++ b/config/locales/de_DE.yml @@ -137,7 +137,8 @@ de_DE: unprocessable_entity: title: "Die gewünschte Änderung wurde abgelehnt (422). " message_html: "

Die gewünschte Änderung wurde abgelehnt. Vielleicht haben Sie versucht, etwas zu ändern, auf das Sie keinen Zugriff haben.

Zur Startseite zurückkehren

" - stimulus_reflex_error: "Es tut uns leid, etwas ist schief gelaufen. \n\nDies könnte ein vorübergehendes Problem sein. Bitte versuchen Sie es erneut oder laden Sie die Seite neu. \nWir erfassen alle Fehler und arbeiten möglicherweise bereits an einer Lösung. \nWenn das Problem weiterhin besteht oder Ihr Anliegen dringend ist, kontaktieren Sie uns bitte." + general_error: + message: "Es tut uns leid, etwas ist schief gelaufen. \n\nDies könnte ein vorübergehendes Problem sein. Bitte versuchen Sie es erneut oder laden Sie die Seite neu. \nWir erfassen alle Fehler und arbeiten möglicherweise bereits an einer Lösung. \nWenn das Problem weiterhin besteht oder Ihr Anliegen dringend ist, kontaktieren Sie uns bitte." stripe: error_code: incorrect_number: "Die Kreditkartennummer ist fehlerhaft." @@ -534,6 +535,7 @@ de_DE: edit: Bearbeiten clone: Duplizieren delete: Löschen + remove: Löschen image: edit: Bearbeiten adjustments: @@ -755,6 +757,7 @@ de_DE: index: header: title: Produkte verwalten + content: loading: Produkte werden geladen... filters: search_products: Nach Produkten suchen @@ -792,8 +795,12 @@ de_DE: new_variant: Neue Produktvariante bulk_update: success: Die Änderungen wurden gespeichert. - edit_image: - close: Zurück + variant_row: + none_tax_category: Nichts + category_field_name: "Kategorie" + tax_category_field_name: "Steuerkategorie" + product_row: + producer_field_name: "Produzent" product_import: title: Produkte importieren file_not_found: Die Datei konnte nicht gefunden oder nicht geöffnet werden. @@ -2013,7 +2020,6 @@ de_DE: label_account: "Konto" label_more: "Mehr anzeigen" label_less: "Weniger anzeigen" - label_notices: "Ankündigungen" cart_items: "Artikel" cart_headline: "Ihr Warenkorb" total: "Summe" @@ -3890,6 +3896,9 @@ de_DE: validation: must_be_int: "muss eine ganze Zahl sein" admin: + images: + edit: + close: Zurück mail_methods: send_testmail: "Test-E-Mail senden" testmail: @@ -3917,6 +3926,10 @@ de_DE: customers: "Kunden" groups: "Gruppen" oidc_settings: "OIDC-Einstellungen" + overview: "Übersicht" + product_import: "Importieren" + enterprise_roles: "Rollen" + payment_methods: "Zahlungsarten" product_properties: index: inherits_properties_checkbox_hint: "Übernahme der Eigenschaften von %{supplier} (außer oben überschrieben)?" diff --git a/config/locales/el.yml b/config/locales/el.yml index f8e2a3864d5..9d86099491a 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -384,6 +384,7 @@ el: edit: Επεξεργασία clone: Κλώνος delete: Διαγραφή + remove: Αφαίρεση image: edit: Επεξεργασία adjustments: @@ -592,8 +593,12 @@ el: producers: label: Παραγωγοί search: Αναζήτηση - edit_image: - close: Πίσω + variant_row: + none_tax_category: Κανένας + category_field_name: "Κατηγορία" + tax_category_field_name: "Φορολογική Κατηγορία" + product_row: + producer_field_name: "Παραγωγός" product_import: title: Είσαγωγή Προϊόντος file_not_found: Το αρχείο δεν βρέθηκε ή δεν μπόρεσε να φορτωθεί @@ -1561,7 +1566,6 @@ el: label_account: "Λογαριασμός" label_more: "Εμφάνισε κι άλλα" label_less: "Εμφάνισε λιγότερα" - label_notices: "Ειδοποίηση" cart_items: "προϊόντα" cart_headline: "Το καλάθι αγορών σου" total: "Σύνολο" @@ -3258,6 +3262,9 @@ el: validation: must_be_int: "πρέπει να είναι ακέραιος" admin: + images: + edit: + close: Πίσω mail_methods: send_testmail: "Αποστολή δοκιμαστικού email" testmail: @@ -3284,6 +3291,8 @@ el: enterprise_relationships: "Άδειες" customers: "Πελάτες" groups: "Ομάδες" + product_import: "Εισαγωγή" + payment_methods: "Τρόποι πληρωμής" product_properties: index: inherits_properties_checkbox_hint: "Κληρονομεί ιδιότητες από %{supplier}; (εκτός αν παρακαμφθεί παραπάνω)" diff --git a/config/locales/en.yml b/config/locales/en.yml index e20236b1d9a..e4be4f68434 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -29,6 +29,8 @@ en: spree/product: Product spree/shipping_method: Shipping Method attributes: + spree/image: + attachment: Attachment spree/order/ship_address: address1: "Shipping address (Street + House number)" address2: "Shipping address line 2" @@ -175,14 +177,15 @@ en: message_html: "

The change you wanted was rejected. Maybe you tried to change something you don't have access to.

Return home

" - stimulus_reflex_error: "We're sorry, but something went wrong. + general_error: + message: "We're sorry, but something went wrong. - This might be a temporary problem, so please try again or reload the page. + This might be a temporary problem, so please try again or reload the page. - We record all errors and may be working on a fix. + We record all errors and may be working on a fix. - If the problem persists or is urgent, please contact us." + If the problem persists or is urgent, please contact us." stripe: error_code: incorrect_number: "The card number is incorrect." @@ -570,6 +573,7 @@ en: per_page: "%{count} items per page" colums: Columns columns: + image: Image name: Name unit_scale: Unit scale unit: Unit @@ -600,6 +604,7 @@ en: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit adjustments: @@ -659,7 +664,7 @@ en: choose: "Choose..." please_select: Please select... - column_save_as_default: Save As Default + column_save_as_default: Save as default columns: Columns actions: Actions viewing: "Viewing: %{current_view_name}" @@ -758,6 +763,9 @@ en: balance_due: "Balance Due" destroy: has_associated_subscriptions: "Delete failed: This customer has active subscriptions. Cancel them first." + column_preferences: + bulk_update: + success: "Column preferences saved" contents: edit: title: Content @@ -897,10 +905,6 @@ en: new_variant: New variant bulk_update: success: Changes saved - edit_image: - title: Edit product photo - close: Back - upload: Upload photo delete_product: success: Successfully deleted the product error: Unable to delete the product @@ -909,6 +913,11 @@ en: error: Unable to delete the variant variant_row: none_tax_category: None + search_for_tax_categories: "Search for tax categories" + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -1058,6 +1067,7 @@ en: edit: order_sure_want_to: Are you sure you want to %{event} this order? voucher_tax_included_in_price: "%{label} (tax included in voucher)" + tax_on_fees: "Tax on fees" invoice_email_sent: 'Invoice email has been sent' order_email_resent: 'Order email has been resent' bulk_management: @@ -1350,6 +1360,7 @@ en: enable: "Allow data sharing" disable: "Stop sharing" loading: "Loading" + need_to_be_manager: "Only managers can connect apps." note: | Your Open Food Network account is connected to Discover Regenerative. Add or update information on your Discover Regenerative listing here. @@ -2185,7 +2196,6 @@ en: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Notices" cart_items: "items" cart_headline: "Your shopping cart" @@ -4141,6 +4151,11 @@ See the %{link} to find out more about %{sitename}'s features and to start using must_be_int: "must be an integer" admin: + images: + edit: + title: Edit product photo + close: Back + upload: Upload photo mail_methods: send_testmail: "Send test email" testmail: @@ -4168,6 +4183,10 @@ See the %{link} to find out more about %{sitename}'s features and to start using customers: "Customers" groups: "Groups" oidc_settings: "OIDC Settings" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_AU.yml b/config/locales/en_AU.yml index 553225c8464..4c1fa3fd903 100644 --- a/config/locales/en_AU.yml +++ b/config/locales/en_AU.yml @@ -346,6 +346,7 @@ en_AU: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit begins_at: Begins At @@ -556,8 +557,12 @@ en_AU: clear_search: Clear search table: new_variant: New variant - edit_image: - close: Back + variant_row: + none_tax_category: None + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -939,7 +944,16 @@ en_AU: customers: Customer active: Active? connected_apps: + tagline: "By clicking ‘Allow data sharing’, you are sharing data between Open Food Network and the Discover Regenerative Portal, and agreeing to make specific data public on the Portal, which will also be publicly available on the API.\nIMPORTANT: Before you stop sharing and remove your listing, please first contact hello@regenerative.org.au to request a copy of your Discover Regenerative data." loading: "Loading" + description_html: | +

+ Discover Regenerative is a showcase of Australia’s Regenerative Farmers, their produce/products, outcomes and achievements. It simplifies how business-to-business (B2B) / wholesale buyers can find regenerative produce and directly connect with Producers. +

+

+ Visit Discover Regenerative + +

actions: edit_profile: Settings properties: Properties @@ -1583,7 +1597,6 @@ en_AU: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Notices" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -3306,6 +3319,9 @@ en_AU: header: store: Store admin: + images: + edit: + close: Back subscriptions: number: "Number" tab: @@ -3326,6 +3342,10 @@ en_AU: enterprise_relationships: "Permissions" customers: "Customers" groups: "Groups" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_BE.yml b/config/locales/en_BE.yml index 3eedba8b4ee..a46d2ec8072 100644 --- a/config/locales/en_BE.yml +++ b/config/locales/en_BE.yml @@ -320,6 +320,7 @@ en_BE: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit begins_at: Begins At @@ -517,8 +518,12 @@ en_BE: search: Search table: new_variant: New variant - edit_image: - close: Back + variant_row: + none_tax_category: None + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -1468,7 +1473,6 @@ en_BE: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Notices" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -3023,6 +3027,9 @@ en_BE: header: store: Store admin: + images: + edit: + close: Back subscriptions: number: "Number" tab: @@ -3043,6 +3050,10 @@ en_BE: enterprise_relationships: "Permissions" customers: "Customers" groups: "Groups" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_CA.yml b/config/locales/en_CA.yml index 29a11fa88f7..58e7bfb041a 100644 --- a/config/locales/en_CA.yml +++ b/config/locales/en_CA.yml @@ -141,7 +141,8 @@ en_CA: unprocessable_entity: title: "The change you wanted was rejected (422)" message_html: "

The change you wanted was rejected. Maybe you tried to change something you don't have access to.

Return home

" - stimulus_reflex_error: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all erros and may be working on a fix.\nIf the problem persists or is urgent, please contact us." + general_error: + message: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all erros and may be working on a fix.\nIf the problem persists or is urgent, please contact us." stripe: error_code: incorrect_number: "The card number is incorrect." @@ -222,12 +223,16 @@ en_CA: not_available_to_shop: "is not available to %{shop}" card_details: "Card details" card_type: "Card type" + card_type_is: "Card type is" + unrecognized_card_type: "Unrecognized card type" + use_new_cc: "Use a new credit card" + what_is_this: "What is this?" cardholder_name: "Cardholder name" community_forum_url: "Community forum URL" customer_instructions: "Customer instructions" additional_information: "Additional information" connect_app: - url: "https://n8n.opernfoodnetwork.org/webhook/regen-CAN/connect-enterprise" + url: "https://n8n.openfoodnetwork.org/webhook/foodjustice/connect-enterprise" devise: passwords: spree_user: @@ -546,6 +551,7 @@ en_CA: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit adjustments: @@ -650,6 +656,7 @@ en_CA: status: Status ok: Ok instance_secret_key: Instance Secret Key + instance_publishable_key: Instance Publishable Key account_id: Account ID business_name: Business Name charges_enabled: Charges Enabled @@ -771,6 +778,7 @@ en_CA: index: header: title: Bulk Edit Products + content: loading: Loading your products delete_modal: delete_product_modal: @@ -821,16 +829,19 @@ en_CA: new_variant: New variant bulk_update: success: Changes saved - edit_image: - title: Edit product photo - close: Back - upload: Upload photo delete_product: success: Successfully deleted the product error: Unable to delete the product delete_variant: success: Successfully deleted the variant error: Unable to delete the variant + variant_row: + none_tax_category: None + search_for_tax_categories: "Search for tax categories" + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -1269,8 +1280,8 @@ en_CA: custom_tab_content: "Content for custom tab" connected_apps: legend: "Connected apps" - title: "Discover Regenerative" - tagline: "Allow Discover Regenerative to publish your enterprise information." + title: "Discover Food Justice" + tagline: "Allow OFN Canada to publish your enterprise information." enable: "Allow data sharing" disable: "Stop sharing" loading: "Loading" @@ -1279,15 +1290,12 @@ en_CA: Add or update information on your Discover Regenerative listing here. link_label: "Manage listing" description_html: | -

- Eligible producers can showcase their regenerative credentials, - farming practices, and more through a profile listing. - This simplifies how buyers can find regenerative products and connect - with producers of interest. +

+ Eligible producers can showcase call to actions to Volunteer Local, Buy Local, or Donate Local. + This simplifies how producers can connect in the Waterloo region around food justice and sovereignty.

- Learn more about Discover Regenerative + Learn more about the Waterloo Food Commons Project

actions: @@ -2080,7 +2088,6 @@ en_CA: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Notices" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -2492,6 +2499,7 @@ en_CA: orders_bought_already_confirmed: "* already confirmed" orders_confirm_cancel: "Are you sure you want to cancel this order?" order_processed_successfully: "Your order has been processed successfully" + thank_you_for_your_order: "Thank you for your order" products_cart_distributor_choice: "Distributor for your order:" products_cart_distributor_change: "Your distributor for this order will be changed to %{name} if you add this product to your cart." products_cart_distributor_is: "Your distributor for this order is %{name}." @@ -3715,6 +3723,7 @@ en_CA: editing_tax_category: "Editing tax category" editing_tax_rate: "Editing tax rate" editing_zone: "Editing zone" + editing_state: "Editing Province" expiration: "Expiration" invalid_payment_provider: "Invalid payment provider" items_cannot_be_shipped: "Items cannot be shipped" @@ -3753,6 +3762,7 @@ en_CA: resend: "Resend" back_to_orders_list: "Back to Orders List" back_to_payments_list: "Back To Payments List" + back_to_states_list: "Back To Provinces List" return_authorizations: "Return Authoriations" cannot_create_returns: "Cannot create returns as this order has no shipped units" select_stock: "Select stock" @@ -3955,6 +3965,11 @@ en_CA: validation: must_be_int: "must be an integer" admin: + images: + edit: + title: Edit product photo + close: Back + upload: Upload photo mail_methods: send_testmail: "Send test email" testmail: @@ -3982,6 +3997,10 @@ en_CA: customers: "Customers" groups: "Groups" oidc_settings: "OIDC Settings" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_DE.yml b/config/locales/en_DE.yml index 80ac27c6ed4..9168b2148ab 100644 --- a/config/locales/en_DE.yml +++ b/config/locales/en_DE.yml @@ -325,6 +325,7 @@ en_DE: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit begins_at: Begins At @@ -522,8 +523,12 @@ en_DE: search: Search table: new_variant: New variant - edit_image: - close: Back + variant_row: + none_tax_category: None + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -1478,7 +1483,6 @@ en_DE: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Notices" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -3036,6 +3040,9 @@ en_DE: header: store: Store admin: + images: + edit: + close: Back subscriptions: number: "Number" tab: @@ -3056,6 +3063,10 @@ en_DE: enterprise_relationships: "Permissions" customers: "Customers" groups: "Groups" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_FR.yml b/config/locales/en_FR.yml index 1a50fd62679..3212f8e7bf0 100644 --- a/config/locales/en_FR.yml +++ b/config/locales/en_FR.yml @@ -141,7 +141,8 @@ en_FR: unprocessable_entity: title: "The change you wanted was rejected (422)" message_html: "

The change you wanted was rejected. Maybe you tried to change something you don't have access to.

Return home

" - stimulus_reflex_error: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us." + general_error: + message: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us." stripe: error_code: incorrect_number: "The card number is incorrect." @@ -550,6 +551,7 @@ en_FR: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit adjustments: @@ -776,6 +778,7 @@ en_FR: index: header: title: Bulk Edit Products + content: loading: Loading your products delete_modal: delete_product_modal: @@ -826,16 +829,19 @@ en_FR: new_variant: New variant bulk_update: success: Changes saved - edit_image: - title: Edit product photo - close: Back - upload: Upload photo delete_product: success: Successfully deleted the product error: Unable to delete the product delete_variant: success: Successfully deleted the variant error: Unable to delete the variant + variant_row: + none_tax_category: None + search_for_tax_categories: "Search for tax categories" + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -984,6 +990,7 @@ en_FR: edit: order_sure_want_to: Are you sure you want to %{event} this order? voucher_tax_included_in_price: "%{label} (tax included in voucher)" + tax_on_fees: "Tax on fees" invoice_email_sent: 'Invoice email has been sent' order_email_resent: 'Order email has been resent' bulk_management: @@ -1279,6 +1286,7 @@ en_FR: enable: "Allow data sharing" disable: "Stop sharing" loading: "Loading" + need_to_be_manager: "Only managers can connect apps." note: | Your Open Food Network account is connected to Discover Regenerative. Add or update information on your Discover Regenerative listing here. @@ -2085,7 +2093,6 @@ en_FR: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Notices" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -3964,6 +3971,11 @@ en_FR: validation: must_be_int: "must be an integer" admin: + images: + edit: + title: Edit product photo + close: Back + upload: Upload photo mail_methods: send_testmail: "Send test email" testmail: @@ -3991,6 +4003,10 @@ en_FR: customers: "Customers" groups: "Groups" oidc_settings: "OIDC Settings" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml index 3530fc640f9..0f9a7175e00 100644 --- a/config/locales/en_GB.yml +++ b/config/locales/en_GB.yml @@ -138,7 +138,8 @@ en_GB: unprocessable_entity: title: "The change you wanted was rejected (422)" message_html: "

The change you wanted was rejected. Maybe you tried to change something you don't have access to.

Return home

" - stimulus_reflex_error: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us." + general_error: + message: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us." stripe: error_code: incorrect_number: "The card number is incorrect." @@ -538,6 +539,7 @@ en_GB: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit adjustments: @@ -762,6 +764,7 @@ en_GB: index: header: title: Bulk Edit Products + content: loading: Loading your products delete_modal: delete_product_modal: @@ -809,16 +812,18 @@ en_GB: new_variant: New variant bulk_update: success: Changes saved - edit_image: - title: Edit product photo - close: Back - upload: Upload photo delete_product: success: Successfully deleted the product error: Unable to delete the product delete_variant: success: Successfully deleted the variant error: Unable to delete the variant + variant_row: + none_tax_category: None + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -2065,7 +2070,6 @@ en_GB: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Community Forum" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -2240,7 +2244,7 @@ en_GB: email_so_placement_intro_html: "You have a new order with %{distributor}" email_so_placement_details_html: "Here are the details of your order for %{distributor}:" email_so_placement_changes: "Unfortunately, not all products that you requested were available. The original quantities that you requested appear crossed-out below." - email_so_payment_success_intro_html: "An automatic payment has been processed for your order from %{distributor}." + email_so_payment_success_intro_html: "Your subscription order from %{distributor} has been processed. \nIf you chose to pay for your subscription via card, you will now be charged." email_so_placement_explainer_html: "This order was automatically created for you." email_so_edit_true_html: "You can make changes until orders close on %{orders_close_at}." email_so_edit_false_html: "You can view details of this order at any time." @@ -3947,6 +3951,11 @@ en_GB: validation: must_be_int: "must be an integer" admin: + images: + edit: + title: Edit product photo + close: Back + upload: Upload photo mail_methods: send_testmail: "Send test email" testmail: @@ -3974,6 +3983,10 @@ en_GB: customers: "Customers" groups: "Groups" oidc_settings: "OIDC Settings" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_IE.yml b/config/locales/en_IE.yml index d58402827c9..4e2b0771a76 100644 --- a/config/locales/en_IE.yml +++ b/config/locales/en_IE.yml @@ -141,7 +141,8 @@ en_IE: unprocessable_entity: title: "The change you wanted was rejected (422)" message_html: "

The change you wanted was rejected. Maybe you tried to change something you don't have access to.

Return home

" - stimulus_reflex_error: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us." + general_error: + message: "We're sorry, but something went wrong.\n\nThis might be a temporary problem, so please try again or reload the page.\nWe record all errors and may be working on a fix.\nIf the problem persists or is urgent, please contact us." stripe: error_code: incorrect_number: "The card number is incorrect." @@ -540,6 +541,7 @@ en_IE: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit adjustments: @@ -761,6 +763,7 @@ en_IE: index: header: title: Bulk Edit Products + content: loading: Loading your products delete_modal: delete_product_modal: @@ -811,16 +814,18 @@ en_IE: new_variant: New variant bulk_update: success: Changes saved - edit_image: - title: Edit product photo - close: Back - upload: Upload photo delete_product: success: Successfully deleted the product error: Unable to delete the product delete_variant: success: Successfully deleted the variant error: Unable to delete the variant + variant_row: + none_tax_category: None + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -2067,7 +2072,6 @@ en_IE: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Community Forum" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -3949,6 +3953,11 @@ en_IE: validation: must_be_int: "must be an integer" admin: + images: + edit: + title: Edit product photo + close: Back + upload: Upload photo mail_methods: send_testmail: "Send test email" testmail: @@ -3976,6 +3985,10 @@ en_IE: customers: "Customers" groups: "Groups" oidc_settings: "OIDC Settings" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_IN.yml b/config/locales/en_IN.yml index 64b8d02c11c..554bfff26ef 100644 --- a/config/locales/en_IN.yml +++ b/config/locales/en_IN.yml @@ -333,6 +333,7 @@ en_IN: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit begins_at: Begins At @@ -540,8 +541,12 @@ en_IN: clear_search: Clear search table: new_variant: New variant - edit_image: - close: Back + variant_row: + none_tax_category: None + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -1535,7 +1540,6 @@ en_IN: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Community Forum" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -3222,6 +3226,9 @@ en_IN: header: store: Store admin: + images: + edit: + close: Back subscriptions: number: "Number" tab: @@ -3242,6 +3249,10 @@ en_IN: enterprise_relationships: "Permissions" customers: "Customers" groups: "Groups" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_NZ.yml b/config/locales/en_NZ.yml index 0abd85c023b..89ce78b137e 100644 --- a/config/locales/en_NZ.yml +++ b/config/locales/en_NZ.yml @@ -468,6 +468,7 @@ en_NZ: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit adjustments: @@ -693,8 +694,12 @@ en_NZ: clear_search: Clear search table: new_variant: New variant - edit_image: - close: Back + variant_row: + none_tax_category: None + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -1809,7 +1814,6 @@ en_NZ: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Notices" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -3554,6 +3558,9 @@ en_NZ: header: store: Store admin: + images: + edit: + close: Back subscriptions: number: "Number" tab: @@ -3574,6 +3581,10 @@ en_NZ: enterprise_relationships: "Permissions" customers: "Customers" groups: "Groups" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_PH.yml b/config/locales/en_PH.yml index c492d71a9f5..e17980febf5 100644 --- a/config/locales/en_PH.yml +++ b/config/locales/en_PH.yml @@ -332,6 +332,7 @@ en_PH: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit begins_at: Begins At @@ -532,8 +533,12 @@ en_PH: search: Search table: new_variant: New variant - edit_image: - close: Back + variant_row: + none_tax_category: None + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -1514,7 +1519,6 @@ en_PH: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Notices" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -3168,6 +3172,9 @@ en_PH: header: store: Store admin: + images: + edit: + close: Back subscriptions: number: "Number" tab: @@ -3188,6 +3195,10 @@ en_PH: enterprise_relationships: "Permissions" customers: "Customers" groups: "Groups" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_TEST.yml b/config/locales/en_TEST.yml new file mode 100644 index 00000000000..6aa6e4e7ec2 --- /dev/null +++ b/config/locales/en_TEST.yml @@ -0,0 +1,12 @@ +# Test language file +# --------------------- +# +# All production environments set their own locale. The source locale `en.yml` +# is used as a fallback but no server is using it directly. +# +# Using this test locale reflects that setup more realistically and means that +# we include fallback translations in our tests. +# +en: + # Overridden here due to a bug in spree i18n (Issue #870, and issue #1800) + language_name: "English" # Localised name of this language diff --git a/config/locales/en_US.yml b/config/locales/en_US.yml index 58e3454eba9..f1ba7d41aa9 100644 --- a/config/locales/en_US.yml +++ b/config/locales/en_US.yml @@ -446,6 +446,7 @@ en_US: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit adjustments: @@ -671,8 +672,12 @@ en_US: clear_search: Clear search table: new_variant: New variant - edit_image: - close: Back + variant_row: + none_tax_category: None + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -1761,7 +1766,6 @@ en_US: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Notices" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -3563,6 +3567,9 @@ en_US: validation: must_be_int: "must be an integer" admin: + images: + edit: + close: Back mail_methods: send_testmail: "Send test email" testmail: @@ -3589,6 +3596,10 @@ en_US: enterprise_relationships: "Permissions" customers: "Customers" groups: "Groups" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/en_ZA.yml b/config/locales/en_ZA.yml index 0d920527ad1..3511b7ae8fe 100644 --- a/config/locales/en_ZA.yml +++ b/config/locales/en_ZA.yml @@ -332,6 +332,7 @@ en_ZA: edit: Edit clone: Clone delete: Delete + remove: Remove image: edit: Edit begins_at: Begins At @@ -536,8 +537,12 @@ en_ZA: clear_search: Clear search table: new_variant: New variant - edit_image: - close: Back + variant_row: + none_tax_category: None + category_field_name: "Category" + tax_category_field_name: "Tax Category" + product_row: + producer_field_name: "Producer" product_import: title: Product Import file_not_found: File not found or could not be opened @@ -1516,7 +1521,6 @@ en_ZA: label_account: "Account" label_more: "Show more" label_less: "Show less" - label_notices: "Community Forum" cart_items: "items" cart_headline: "Your shopping cart" total: "Total" @@ -3098,6 +3102,9 @@ en_ZA: header: store: Store admin: + images: + edit: + close: Back subscriptions: number: "Number" tab: @@ -3118,6 +3125,10 @@ en_ZA: enterprise_relationships: "Permissions" customers: "Customers" groups: "Groups" + overview: "Overview" + product_import: "Import" + enterprise_roles: "Roles" + payment_methods: "Payment Methods" product_properties: index: inherits_properties_checkbox_hint: "Inherit properties from %{supplier}? (unless overridden above)" diff --git a/config/locales/es.yml b/config/locales/es.yml index 7c3473f7c2a..96dcab40fe6 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -478,6 +478,7 @@ es: edit: Editar clone: Duplicar delete: Borrar + remove: Eliminar image: edit: Editar adjustments: @@ -694,6 +695,7 @@ es: index: header: title: Editar varios Productos + content: loading: Cargando tus productos filters: producers: @@ -711,8 +713,12 @@ es: reset: Desechar Cambios save: Guardar Cambios new_variant: Nueva variante - edit_image: - close: Atrás + variant_row: + none_tax_category: Ninguno + category_field_name: "Categoría" + tax_category_field_name: "Categoría de impuestos" + product_row: + producer_field_name: "Productora" product_import: title: Importación de productos file_not_found: Archivo no encontrado o no se pudo abrir @@ -1860,7 +1866,6 @@ es: label_account: "Cuenta" label_more: "Mostrar más" label_less: "Mostrar menos" - label_notices: "Noticias" cart_items: "elementos" cart_headline: "Su carrito de compras" total: "Total" @@ -3705,6 +3710,9 @@ es: validation: must_be_int: "debe ser un entero" admin: + images: + edit: + close: Atrás mail_methods: send_testmail: "Enviar correo electrónico de prueba" testmail: @@ -3731,6 +3739,10 @@ es: enterprise_relationships: "Permisos" customers: "Consumidoras" groups: "Redes" + overview: "Visión general" + product_import: "Importar" + enterprise_roles: "Roles" + payment_methods: "Métodos de Pago" product_properties: index: inherits_properties_checkbox_hint: "¿Heredar propiedades desde %{supplier}? (a menos que sea anulado arriba)" diff --git a/config/locales/es_CO.yml b/config/locales/es_CO.yml index 964ea1c945e..599cc1115b3 100644 --- a/config/locales/es_CO.yml +++ b/config/locales/es_CO.yml @@ -356,6 +356,7 @@ es_CO: edit: Editar clone: Duplicar delete: Borrar + remove: Eliminar image: edit: Editar begins_at: Empieza en @@ -560,8 +561,12 @@ es_CO: search: Buscar table: new_variant: Nueva variante - edit_image: - close: Atrás + variant_row: + none_tax_category: Ninguno + category_field_name: "Categoría" + tax_category_field_name: "Categoría de impuestos" + product_row: + producer_field_name: "Productor" product_import: title: Importe de producto file_not_found: Archivo no encontrado o no se pudo abrir @@ -1563,7 +1568,6 @@ es_CO: label_account: "Cuenta" label_more: "Mostrar más" label_less: "Mostrar menos" - label_notices: "Noticias" cart_items: "Elementos" cart_headline: "Su carrito de compras" total: "Total" @@ -3278,6 +3282,9 @@ es_CO: header: store: Tienda admin: + images: + edit: + close: Atrás subscriptions: number: "Número" tab: @@ -3298,6 +3305,10 @@ es_CO: enterprise_relationships: "Permisos" customers: "Cliente" groups: "Grupos" + overview: "Vista general" + product_import: "Importar" + enterprise_roles: "Roles" + payment_methods: "Métodos de Pago" product_properties: index: inherits_properties_checkbox_hint: "¿Heredar propiedades desde %{supplier}? (a menos que sea anulado arriba)" diff --git a/config/locales/es_CR.yml b/config/locales/es_CR.yml index 3b903b274c4..35a5fc90d93 100644 --- a/config/locales/es_CR.yml +++ b/config/locales/es_CR.yml @@ -468,6 +468,7 @@ es_CR: edit: Editar clone: Duplicar delete: Borrar + remove: Eliminar image: edit: Editar adjustments: @@ -697,8 +698,12 @@ es_CR: clear_search: Borrar búsqueda table: new_variant: Nueva variante - edit_image: - close: Atrás + variant_row: + none_tax_category: Ninguno + category_field_name: "Categoría" + tax_category_field_name: "Categoría de impuestos" + product_row: + producer_field_name: "Productor" product_import: title: Importe de producto file_not_found: Archivo no encontrado o no se pudo abrir @@ -1818,7 +1823,6 @@ es_CR: label_account: "Cuenta" label_more: "Mostrar más" label_less: "Mostrar menos" - label_notices: "Noticias" cart_items: "Elementos" cart_headline: "Su carrito de compras" total: "Total" @@ -3624,6 +3628,9 @@ es_CR: header: store: Tienda admin: + images: + edit: + close: Atrás unit_price_tooltip: "El precio unitario aumenta la transparencia al permitir que sus clientes comparen fácilmente los precios entre diferentes productos y tamaños de empaque. Tenga en cuenta que el precio unitario final que se muestra en la tienda puede diferir, ya que incluye impuestos y tarifas." subscriptions: number: "Número" @@ -3645,6 +3652,10 @@ es_CR: enterprise_relationships: "Permisos" customers: "Cliente" groups: "Grupos" + overview: "Vista general" + product_import: "Importar" + enterprise_roles: "Roles" + payment_methods: "Métodos de pago" product_properties: index: inherits_properties_checkbox_hint: "¿Heredar propiedades desde %{supplier}? (a menos que sea anulado arriba)" diff --git a/config/locales/es_US.yml b/config/locales/es_US.yml index 35e2dc488b0..033369229a2 100644 --- a/config/locales/es_US.yml +++ b/config/locales/es_US.yml @@ -445,6 +445,7 @@ es_US: edit: Editar clone: Duplicar delete: Borrar + remove: Eliminar image: edit: Editar adjustments: @@ -669,8 +670,12 @@ es_US: clear_search: Limpiar la búsqueda table: new_variant: Nueva variante - edit_image: - close: Atrás + variant_row: + none_tax_category: Ninguno + category_field_name: "Categoría" + tax_category_field_name: "Categoría del impuesto" + product_row: + producer_field_name: "Productora" product_import: title: Importación de productos file_not_found: Archivo no encontrado o no se pudo abrir @@ -1719,7 +1724,6 @@ es_US: label_account: "Cuenta" label_more: "Mostrar más" label_less: "Mostrar menos" - label_notices: "Noticias" cart_items: "elementos" cart_headline: "Su carrito de compras" total: "Total" @@ -3514,6 +3518,9 @@ es_US: validation: must_be_int: "debe ser un entero" admin: + images: + edit: + close: Atrás mail_methods: send_testmail: "Enviar email de prueba" testmail: @@ -3540,6 +3547,10 @@ es_US: enterprise_relationships: "Permisos" customers: "Consumidoras" groups: "Redes" + overview: "Visión general" + product_import: "Importar" + enterprise_roles: "Roles" + payment_methods: "Métodos de Pago" product_properties: index: inherits_properties_checkbox_hint: "¿Heredar propiedades desde %{supplier}? (a menos que sea anulado arriba)" diff --git a/config/locales/fil_PH.yml b/config/locales/fil_PH.yml index 13c709fda43..29aae4c87fa 100644 --- a/config/locales/fil_PH.yml +++ b/config/locales/fil_PH.yml @@ -332,6 +332,7 @@ fil_PH: edit: i-edit clone: Gayahin delete: Tanggalin + remove: Tanggalin image: edit: i-edit begins_at: nagsimula sa @@ -533,8 +534,12 @@ fil_PH: search: hanapin table: new_variant: bagong uri - edit_image: - close: bumalik + variant_row: + none_tax_category: wala + category_field_name: "kategorya" + tax_category_field_name: "kategorya ng tax" + product_row: + producer_field_name: "Producer" product_import: title: paglipat ng produkto file_not_found: 'ang file ay hindi mahanap o mabuksan ' @@ -1516,7 +1521,6 @@ fil_PH: label_account: "Account" label_more: "ipakita ang iba pa" label_less: "huwag ipakita ang lahat" - label_notices: "mga abiso" cart_items: "mga item" cart_headline: "Ang iyong shopping cart" total: "kabuuan" @@ -3180,6 +3184,9 @@ fil_PH: header: store: tindahan admin: + images: + edit: + close: bumalik subscriptions: number: "Bilang" tab: @@ -3200,6 +3207,10 @@ fil_PH: enterprise_relationships: "mga pahintulot" customers: "mga customer" groups: "mga grupo" + overview: "pangkalahatang ideya" + product_import: "ilipat" + enterprise_roles: "mga tungkulin" + payment_methods: "Mga Paraan ng Pagbabayad" product_properties: index: inherits_properties_checkbox_hint: "kopyahin ang mga katangian mula sa%{supplier}? (maliban kung napatungan ang nasa itaas)" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 74a8d86f471..407cb26ebc9 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -141,7 +141,8 @@ fr: unprocessable_entity: title: "La modification réalisée a été rejetée (erreur 422)" message_html: "

La modification souhaitée a été refusée. Peut-être avez-vous essayé de faire quelque chose sans avoir les droits d'accès suffisants ?

Retourner à l'accueil

" - stimulus_reflex_error: "Nous sommes désolés mais quelque chose s'est mal passé. \n\nC'est un problème temporaire, merci donc de réessayer ou de recharger la page. \nNous enregistrons toutes les erreurs et travaillons sur les améliorations nécessaires.\nSi le problème persiste ou est urgent, merci de nous contacter." + general_error: + message: "Nous sommes désolés mais quelque chose s'est mal passé. \n\nC'est un problème temporaire, merci donc de réessayer ou de recharger la page. \nNous enregistrons toutes les erreurs et travaillons sur les améliorations nécessaires.\nSi le problème persiste ou est urgent, merci de nous contacter." stripe: error_code: incorrect_number: "Le numéro de carte bancaire est incorrect." @@ -549,6 +550,7 @@ fr: edit: Modifier clone: Dupliquer delete: Supprimer + remove: Supprimer image: edit: Modifier adjustments: @@ -775,6 +777,7 @@ fr: index: header: title: Gestion du catalogue produits + content: loading: Vos produits sont en cours de chargement delete_modal: delete_product_modal: @@ -826,16 +829,19 @@ fr: new_variant: Nouvelle variante bulk_update: success: Changements sauvegardés - edit_image: - title: Modifier la photo du produit - close: Retour - upload: Télécharger la photo delete_product: success: Le produit a bien été supprimé error: Le produit n'a pas pu être supprimé delete_variant: success: La variante a bien été supprimée error: La variante n'a pas pu être supprimée + variant_row: + none_tax_category: Aucun + search_for_tax_categories: "Chercher les catégories de taxes" + category_field_name: "Catégorie" + tax_category_field_name: "TVA applicable" + product_row: + producer_field_name: "Producteur" product_import: title: Import liste produits file_not_found: Fichier non trouvé ou impossible à ouvrir @@ -984,6 +990,7 @@ fr: edit: order_sure_want_to: Êtes-vous sûr de vouloir %{event} cette commande ? voucher_tax_included_in_price: "%{label} (taxe inclue dans le bon de réduction)" + tax_on_fees: "Taxe sur les frais" invoice_email_sent: 'L''email de facturation a bien été envoyé' order_email_resent: 'L''email de commande a de nouveau été envoyé' bulk_management: @@ -1280,6 +1287,7 @@ fr: enable: "Autoriser le partage de données" disable: "Arrêter le partage" loading: "Chargement en cours" + need_to_be_manager: "Seuls les gestionnaires peuvent connecter des applications." note: | Votre compte Open Food Network est connecté à Discover Regenerative. Ajouter et mettre à jour les informations sur votre liste Discover Regenerative ici. @@ -2090,7 +2098,6 @@ fr: label_account: "Compte" label_more: "Afficher plus" label_less: "Masquer" - label_notices: "Informations" cart_items: "Produits" cart_headline: "Votre panier" total: "Total" @@ -4021,6 +4028,11 @@ fr: validation: must_be_int: "doit être un entier" admin: + images: + edit: + title: Modifier la photo du produit + close: Retour + upload: Télécharger la photo mail_methods: send_testmail: "Envoyer un e-mail de test" testmail: @@ -4048,6 +4060,10 @@ fr: customers: "Acheteurs" groups: "Groupes" oidc_settings: "OIDC" + overview: "Aperçu" + product_import: "Importer" + enterprise_roles: "Roles" + payment_methods: "Méthodes de paiement" product_properties: index: inherits_properties_checkbox_hint: "Hériter des propriétés de %{supplier} ? (non applicable si information de remplacement déjà saisie)" diff --git a/config/locales/fr_BE.yml b/config/locales/fr_BE.yml index 4e08d7b657b..ed48f6004de 100644 --- a/config/locales/fr_BE.yml +++ b/config/locales/fr_BE.yml @@ -95,6 +95,7 @@ fr_BE: on_demand_but_count_on_hand_set: "doit être vide si à la demande" limited_stock_but_no_count_on_hand: "doit être spécifié car le stock limité est forcé" messages: + confirmation: "ne correspond pas à %{attribute}" blank: "Champ obligatoire" errors: messages: @@ -113,8 +114,8 @@ fr_BE: dimension_width_equal_to: "la largeur doit être égale au pixel %{length} ." dimension_height_equal_to: "la hauteur doit être égale au pixel %{length} ." aspect_ratio_not_square: "doit être une image carrée" - aspect_ratio_not_portrait: "doit être une image de portrait" - aspect_ratio_not_landscape: "doit être une image de paysage" + aspect_ratio_not_portrait: "doit être une image en format portrait" + aspect_ratio_not_landscape: "doit être une image en format paysage" aspect_ratio_is_not: "doit avoir un rapport hauteur / largeur de %{aspect_ratio}" aspect_ratio_unknown: "a un rapport hauteur/largeur inconnu" image_not_processable: "n'est pas une image valide" @@ -127,7 +128,8 @@ fr_BE: unprocessable_entity: title: "Le changement que vous souhaitiez a été rejeté (422)" message_html: "

Le changement que vous souhaitiez a été rejeté. Peut-être avez-vous essayé de modifier quelque chose auquel vous n'avez pas accès.

Retour au précédent

" - stimulus_reflex_error: "Nous sommes désolés, une erreur s'est produite. Il s'agit peut-être d'un problème temporaire, veuillez donc réessayer ou recharger la page. Nous enregistrons toutes les erreurs et travaillons peut-être sur un correctif. Si le problème persiste ou est urgent, veuillez nous contacter." + general_error: + message: "Nous sommes désolés, une erreur s'est produite. Il s'agit peut-être d'un problème temporaire, veuillez donc réessayer ou recharger la page. Nous enregistrons toutes les erreurs et travaillons peut-être sur un correctif. Si le problème persiste ou est urgent, veuillez nous contacter." stripe: error_code: incorrect_number: "Le numéro de carte est incorrect." @@ -214,6 +216,7 @@ fr_BE: signed_up_but_unconfirmed: "Un message avec un lien de confirmation a été envoyé à l'adresse email indiquée. Veuillez cliquer sur ce lien pour activer votre compte." unknown_error: "Une erreur s'est glissée lors de la création de votre compte. Vérifiez votre adresse email et recommencez." failure: + disabled: "Votre compte a été désactivé. Veuillez contacter un administrateur pour résoudre ce problème." invalid: | Email / mot de passe incorrect. Créez votre compte ou réinitialisez votre mot de passe. @@ -233,6 +236,8 @@ fr_BE: models: order_cycle: cloned_order_cycle_name: "Copie de %{order_cycle}" + tax_rate: + included_in_price: "Inclus dans le prix" open_street_map_enabled: "Open Street Map activé" resume_order: "Reprendre la commande" sku: "Référence produit" @@ -245,6 +250,10 @@ fr_BE: integer_array_validator: not_array_error: "doit être un array" invalid_element_error: "doit contenir uniquement des nombres entiers" + report_job: + report_failed: | + Ce rapport a échoué. C'est peut-être trop lourd à traiter. + Nous allons examiner la question, mais n'hésitez pas à nous faire savoir si le problème persiste. enterprise_mailer: confirmation_instructions: subject: "Confirmez l'adresse email pour %{enterprise}" @@ -267,6 +276,8 @@ fr_BE: report_ready: subject: "Rapport prêt" heading: "Rapport prêt à télécharger" + intro: | + Le lien ci-dessous expirera après une semaine. shipment_mailer: shipped_email: dear_customer: "Cher Client," @@ -332,6 +343,7 @@ fr_BE: confirm_resend_order_confirmation: "Etes-vous sûr de vouloir renvoyer le mail de confirmation de commande ?" invoice: "Facture" active: "Actif" + download: "Télécharger" cancelled: "Annulée" more: "Plus" say_no: "Non" @@ -400,7 +412,7 @@ fr_BE: copy: Copier change_my_password: "Changer mon mot de passe" update_password: "Mise à jour du mot de passe" - password_confirmation: confirmation du mot de passe + password_confirmation: Confirmation du mot de passe reset_password_token: Réinitialisation du mot de passe expired: a expiré, veuillez en demander un nouveau back_to_payments_list: "Retour à la liste des paiements" @@ -442,6 +454,7 @@ fr_BE: name: Nom unit: Unité unit_value: Valeur unitaire + display_as: Unité d'affichage comme price: Prix producer: Producteur·trice category: Catégorie @@ -467,6 +480,7 @@ fr_BE: edit: Modifier clone: Dupliquer delete: Supprimer + remove: Supprimer image: edit: Modifier adjustments: @@ -547,6 +561,7 @@ fr_BE: terms_of_service: "Conditions d'utilisation" delete: "Supprimer le fichier" confirm_delete: "Voulez-vous vraiment supprimer le fichier actuel des conditions d'utilisation ?" + attachment: "Pièce jointe" create_terms_of_service: "Créer un fichier de conditions d'utilisation" number_localization: number_localization_settings: "Gestion localisation des nombres" @@ -581,6 +596,7 @@ fr_BE: matomo_tag_manager_url: "URL de l'instance sur Matomo" info_html: "Matomo est un site web est une application mobile analytique . Vous pouvez heberger matomo sur place ou heberger dans le cloud. Voyez matomo.org pour plus d'information." config_instructions_html: "Pour utiliser Matomo, vous devez configurer l'intégration avec Open Food France. L'URL de l'instance sur Matomo correspond à l'url du site internet visé par le suivi de la navigation utilisateur. Si le champ est vide, Matomo n'effectuera aucune analyse sur ce site. L'ID de l'instance sur Matomo n'est pas obligatoire, mais nécessaire si vous souhaitez analyser plusieurs sites web sur une seule instance Matomo. Cet ID peut être trouvé sur l'espace administrateur Matomo." + config_instructions_tag_manager_html: "La définition de l'URL de Matomo Tag Manager active la fonctionnalité \"Matomo Tag Manager\". Cet outil vous permet de configurer des événements d'analyse. L'URL de Matomo Tag Manager est copiée à partir de la section \"Code d'installation\" de Matomo Tag Manager. Assurez-vous de sélectionner le bon conteneur et le bon environnement, car ces options modifient l'URL." customers: index: new_customer: "Nouvel acheteur" @@ -671,7 +687,7 @@ fr_BE: infinity: "Infinité" to_order_tip: "Les articles fabriqués sur commande n'ont pas un niveau de stock défini, comme des pains faits à la main." back_to_products_list: "Retour à la liste produits" - editing_product: "Edition de produits" + editing_product: "Éditer le produit" tabs: product_details: "Détails du produit" group_buy_options: "Options d'achat par lot" @@ -693,8 +709,12 @@ fr_BE: clear_search: Effacer recherche table: new_variant: Nouvelle variante - edit_image: - close: Retour + variant_row: + none_tax_category: Aucun + category_field_name: "Catégorie" + tax_category_field_name: "TVA applicable" + product_row: + producer_field_name: "Producteur·trice" product_import: title: Import liste produits file_not_found: Fichier non trouvé ou impossible à ouvrir @@ -850,6 +870,7 @@ fr_BE: order_date: "Complété à " max: "Max" product_unit: "Produit: Unité" + weight_volume: "Poids/Volume (g)" ask: "Demander?" page_title: "Gestion des commandes" actions_delete: "Supprimer la sélection" @@ -1114,7 +1135,7 @@ fr_BE: white_label_logo_link_label: "Lien pour le logo utilisé en vitrine" hide_groups_tab: "Masquer l'onglet des groupes dans la vitrine" create_custom_tab: "Créer un onglet personnalisé dans la vitrine" - custom_tab_title: "Titre de l'onglet personnalisé" + custom_tab_title: "Titre de l'onglet personnalisé (max. 20 caractères)" custom_tab_content: "Contenu de l'onglet personnalisé" connected_apps: loading: "Chargement en cours" @@ -1265,9 +1286,9 @@ fr_BE: add_distributor: 'Ajouter un distributeur' advanced_settings: automatic_notifications: Notifications automatiques - automatic_notifications_tip: Envoi un email automatiquement à tous les producteurs lorsque le cycle de vente ferme. + automatic_notifications_tip: Envoie un email automatiquement à tous les producteurs lorsque le cycle de vente ferme. title: Paramétrages avancés - choose_product_tip: Vous pouvez limiter les produits entrants et sortants à l'inventaire uniquement%{inventory}. + choose_product_tip: Vous pouvez limiter les produits entrants et sortants uniquement à ceux sélectionnés dans le catalogue du comptoir "%{inventory} ". preferred_product_selection_from_coordinator_inventory_only_here: Uniquement les produits du catalogue magasin preferred_product_selection_from_coordinator_inventory_only_all: Tous les produits disponibles dans les catalogues producteurs save_reload: Sauvegarder et rafraichir la page @@ -1398,11 +1419,14 @@ fr_BE: pack_by_customer: Préparation des commandes par Acheteur·euse pack_by_supplier: Préparation des commandes par Producteur·trice pack_by_product: Préparation des commandes par produit + download: + button: "Télécharger le rapport" show: report_taking_longer: > Désolé, ce rapport a pris trop de temps à traiter. Il peut contenir beaucoup de données ou nous sommes occupés par d'autres rapports. Vous pouvez réessayer plus tard. + report_link_label: Télécharger le rapport (si disponible) revenues_by_hub: name: CA par comptoir description: CA par comptoir @@ -1467,7 +1491,7 @@ fr_BE: name: "Rapports de préparation des paniers" subscriptions: index: - title: "commandes récurrantes" + title: "Commandes récurrentes" new: "Nouvel abonnement" new: title: "Nouvel abonnement" @@ -1481,7 +1505,7 @@ fr_BE: filters: query_placeholder: "Recherche par email ..." setup_explanation: - title: "commandes récurrantes" + title: "Commandes récurrentes" just_a_few_more_steps: 'Encore quelques étapes avant de pouvoir commencer:' enable_subscriptions: "Activez la fonction abonnements pour au moins une de vos comptoirs" enable_subscriptions_step_1_html: 1. Allez à %{enterprises_link}, trouvez votre comptoir, et cliquez sur "Gérer" @@ -1567,6 +1591,8 @@ fr_BE: voucher_code: Code du bon d'achat voucher_amount: Quantité voucher_type: Type de bon d'achat + flat_rate: Montant fixe + percentage_rate: Pourcentage (%) controllers: enterprises: stripe_connect_cancelled: "La connexion avec Stripe a été annulée" @@ -1587,7 +1613,7 @@ fr_BE: enterprise_terms_and_conditions: destroy_attachment_does_not_exist: "Le fichier des termes et conditions n'existe pas" orders: - failed_to_update: "Annulation de la mise à jour la commande" + failed_to_update: "Annulation de la mise à jour de la commande" checkout: failed: "La vente a échouée. Veuillez nous le faire savoir afin que nous puissions traiter votre commande." payment_cancelled_due_to_stock: "Paiement annulé : la commande n'a pas pu être finalisée en raison d'un problème de stock." @@ -1673,9 +1699,10 @@ fr_BE: submit: Finaliser la commande cancel: Retour à Mode de paiement errors: + saving_failed: "L'enregistrement a échoué, veuillez mettre à jour les champs en surbrillance." terms_not_accepted: Veuillez accepter les termes et conditions required: Le champ ne peut pas être vide - invalid_number: "s'il vous plaît entrer un numéro de téléphone valide" + invalid_number: "S'il vous plaît, entrez un numéro de téléphone valide" invalid_email: "Veuillez entrer un email valide" select_a_shipping_method: Sélectionnez une méthode d'expédition ou de retrait select_a_payment_method: Choisissez une méthode de paiement @@ -1746,6 +1773,7 @@ fr_BE: invoice_column_price: "Prix" invoice_column_item: "Produit" invoice_column_qty: "Qté" + invoice_column_weight_volume: "Poids / Vol." invoice_column_unit_price_with_taxes: "Prix unitaire TTC" invoice_column_unit_price_without_taxes: "Prix unitaire HT" invoice_column_price_with_taxes: "Prix total TTC" @@ -1840,7 +1868,6 @@ fr_BE: label_account: "Compte" label_more: "Afficher plus" label_less: "Masquer" - label_notices: "Informations" cart_items: "Produits" cart_headline: "Votre panier" total: "Total" @@ -2050,6 +2077,7 @@ fr_BE: producer_mail_order_text: "Voilà la liste et les quantités des produits commandés vous concernant:" producer_mail_delivery_instructions: "Modalités de livraison des produits:" producer_mail_signoff: "Merci et belle fin de journée!" + producer_mail_order_customer_text: "Voici un récapitulatif des commandes regroupées par clients" shopping_oc_closed: Le comptoir est actuellement fermé shopping_oc_closed_description: "Veuillez attendre l'ouverture du prochain cycle de vente (ou contactez directement le comptoir pour voir si nous pouvons accepter une commande tardive)." shopping_oc_last_closed: "Le dernier cycle de vente s'est terminé il y a %{distance_of_time}" @@ -2442,6 +2470,7 @@ fr_BE: shipping_method_destroy_error: "Cette méthode de livraison ne peut pas être supprimée car elle est référencée dans une commande : %{number}." fees: "Frais" fee_name: "Nom de la commission " + fee_owner: "Propriétaire de la commission" item_cost: "Coût du produit" bulk: "Vrac" shop_variant_quantity_min: "min" @@ -2485,7 +2514,7 @@ fr_BE: admin_enterprise_relationships_button_create: "Créer" admin_enterprise_relationships_to: "vers" admin_enterprise_groups: "Groupes d'entreprises" - admin_enterprise_groups_name: "Produit/Variante" + admin_enterprise_groups_name: "NOM DU GROUPE" admin_enterprise_groups_owner: "Manager principal" admin_enterprise_groups_on_front_page: "Sur la page d'accueil?" admin_enterprise_groups_enterprise: "Entreprises" @@ -2510,7 +2539,7 @@ fr_BE: supplier: "Fournisseurs" product_name: "Nom du Produit" product_description: "Description du Produit" - permalink: "permalien" + permalink: "Permalien : Nom pour URL (sans espace)" shipping_categories: "Condition de transport" units: "Unité de mesure" coordinator: "Coordinateur" @@ -2719,6 +2748,7 @@ fr_BE: report_header_total_tax: "Total TVA (%{currency_symbol})" report_header_total_excl_tax: "Total HT (%{currency_symbol})" report_header_total_incl_tax: "Total TTC (%{currency_symbol})" + report_header_total_orders: "Nombre total de commandes" report_header_enterprise: Entreprise report_header_enterprise_fee_name: Nom report_header_enterprise_fee_type: Catégorie @@ -2763,6 +2793,7 @@ fr_BE: report_header_delivery_postcode: Code Postal Livraison report_header_bulk_unit_size: Quantité totale du lot report_header_weight: Poids + report_header_final_weight_volume: Final (Poids/Volume) report_header_height: Taille report_header_width: largeur report_header_depth: profondeur @@ -2817,6 +2848,11 @@ fr_BE: report_header_total_untaxable_admin: Total ajustements non taxables report_header_total_taxable_admin: Total ajustments soumis à TVA (inclut TVA) report_line_line_items: Ces articles + report_header_last_completed_order_date: Date de la dernière commande terminée + initial_invoice_number: "Numéro de facture initial" + invoice_date: "Date de facture" + due_date: "Date d'échéance" + account_code: "Code du compte" equals: "Egal" contains: "contient" discount: "Réduction" @@ -3238,7 +3274,7 @@ fr_BE: order_cycles: create_failure: "La création du cycle de vente a échoué" update_success: 'Votre cycle de vente a été mis à jour.' - update_failure: "La mise à jour du cycle de vente à échoué" + update_failure: "La mise à jour du cycle de vente a échoué" no_distributors: Il n'y a pas de distributeur·trice pour ce cycle de vente. Il ne sera pas visible aux acheteur·euse·s tant qu'il n'y aura pas de distributeur·trice. Voulez-vous tout de même sauvegarder ce cycle de vente ? enterprises: producer: "Producteur·trice" @@ -3365,8 +3401,10 @@ fr_BE: category: "Catégorie" created_successfully: "Créé avec succès" credit: "Crédit" - editing_tax_category: "Modification de la catégorie de taxe" - editing_tax_rate: "Modification du taux de taxe" + editing_tax_category: "Éditer la catégorie de taxe" + editing_tax_rate: "Éditer le taux de taxe" + editing_zone: "Éditer la zone" + editing_state: "Éditer la province" expiration: "Expiration" invalid_payment_provider: "Fournisseur de paiement invalide" items_cannot_be_shipped: "Les articles ne peuvent pas être expédiés" @@ -3380,12 +3418,14 @@ fr_BE: notice_messages: variant_deleted: "Variante supprimée" start_date: "Date de début" + taxonomy_tree_instruction: "Faites un clic droit sur un élément pour ajouter, renommer, supprimer ou modifier." updating: "Mettre à jour" your_order_is_empty_add_product: "Votre commande est vide, merci de chercher et d'ajouter un des produits ci-dessus" add_product: "Ajoutez un produit" name_or_sku: "Nom ou N° d'article (entrer au moins 4 lettres du nom du produit) " resend: "Renvoyer" back_to_orders_list: "Retour vers la liste des commandes " + back_to_states_list: "Retour à la liste des provinces" return_authorizations: "Autorisations de retour" cannot_create_returns: "Impossible de créer des retours car cette commande n'a pas d'unités expédiées." select_stock: "Selectionner stock" @@ -3405,6 +3445,7 @@ fr_BE: no_tracking_present: "Pas de traçage des données fournies." order_total: "Total commande " customer_details: "Données client·e" + customer_details_updated: "Détails du client mis à jour" customer_search: "Recherche client" choose_a_customer: "Choisir un client" account: "Compte" @@ -3456,7 +3497,7 @@ fr_BE: send_mails_as: "Envoyer les mails comme " smtp_send_all_emails_as_from_following_address: "Envoyer tous les mails comme de l'adresse suivante." send_copy_of_all_mails_to: "Envoyez une copie de tous les mails à " - smtp_send_copy_to_this_addresses: "Envoit une copie de tous les mails sortants vers cette adresse. En cas de plusieurs adresses, séparer par une virgule." + smtp_send_copy_to_this_addresses: "Envoie une copie de tous les mails sortants vers cette adresse. En cas de plusieurs adresses, séparer par une virgule." tax_categories: "TVA applicable" listing_tax_categories: "Liste catégories TVA" back_to_tax_categories_list: "Retour à la liste des catégories de TVA" @@ -3480,7 +3521,7 @@ fr_BE: listing_countries: "Liste des pays" iso_name: "Nom ISO" states_required: "Provinces requises" - editing_country: "Pays d'édition" + editing_country: "Éditer le pays" back_to_countries_list: "Retouner vers la liste des pays" states: "Provinces" abbreviation: "Abréviation" @@ -3497,6 +3538,7 @@ fr_BE: shipping_categories: "Condition de transport" new_shipping_category: "Nouvelle catégorie d'expédition " back_to_shipping_categories: "Retour vers les catégories d'expédition" + editing_shipping_category: "Éditer la catégorie d'expédition" name: "Nom" description: "Description" type: "Catégorie" @@ -3515,8 +3557,8 @@ fr_BE: amount: "Quantité" currency: "Devise" first_item: "Coût du premier article " - additional_item: "Coût d'objet supplémentaire" - max_items: "Articles maximum" + additional_item: "Coût supplémentaire par article" + max_items: "Nb d'articles maximum (au delà duquel il n'y a plus de coût supplémentaire)" minimal_amount: "Montant minimal" normal_amount: "Montant normal" discount_amount: "Montant de la remise" @@ -3553,7 +3595,12 @@ fr_BE: cancel: "Annuler" shared: error_messages: - there_were_problems_with_the_following_fields: "Il y a u des erreur avec les champs suivant" + errors_prohibited_this_record_from_being_saved: + one: "1 erreur a empêché la sauvegarde de cet enregistrement :" + few: "Les %{count} erreurs ont empêché la sauvegarde de cet enregistrement :" + many: "Les %{count} erreurs ont empêché la sauvegarde de cet enregistrement :" + other: "Les %{count} erreurs ont empêché la sauvegarde de cet enregistrement :" + there_were_problems_with_the_following_fields: "Il y a eu des erreurs concernant les champs suivants" payments_list: date_time: "Date/Temps" amount: "Quantité" @@ -3568,6 +3615,13 @@ fr_BE: header: store: Aperçu admin: + images: + edit: + close: Retour + mail_methods: + send_testmail: "Envoyer un e-mail de test" + testmail: + error: "Une erreur s'est produite lors de la tentative d'envoi de l'e-mail de test." unit_price_tooltip: "Le prix unitaire permet aux acheteurs de comparer les prix entre les produits et/ou les conditionnements. Attention, le prix final observé par l'acheteur peut être différent si des marges et/ou commissions sont appliquées." subscriptions: number: "N° commande" @@ -3589,6 +3643,10 @@ fr_BE: enterprise_relationships: "Permissions" customers: "Acheteur·euse·s" groups: "Groupes" + overview: "Aperçu" + product_import: "Importer" + enterprise_roles: "Roles" + payment_methods: "Méthodes de paiement" product_properties: index: inherits_properties_checkbox_hint: "Hériter des propriétés de %{supplier} ? (non applicable si information de remplacement déjà saisie)" @@ -3766,7 +3824,7 @@ fr_BE: back_to_payment_methods_list: "Retour à la liste des paiements" edit: new: "Nouveau" - editing_payment_method: "Modification des méthodes de paiement en cours" + editing_payment_method: "Éditer les méthodes de paiement" back_to_payment_methods_list: "Retour à la liste des paiements" stripe_connect: enterprise_select_placeholder: Choisir... @@ -3805,6 +3863,7 @@ fr_BE: no_payment_via_admin_backend: Les payement paypal ne savent pas etre prit dans le Backoffice products: image_upload_error: "Veuillez télécharger l'image au format JPG, PNG, GIF, SVG ou WEBP." + image_not_processable: "L’image jointe n’est pas une image valide." new: title: "Nouveau Produit" new_product: "Nouveau Produit" @@ -3866,7 +3925,7 @@ fr_BE: search: "Rechercher" email: "Email" edit: - editing_user: "Utilisateur·trice d'édition" + editing_user: "Éditer l'utilisateur.rice" back_to_users_list: "Retour vers la liste des utilisateur·trice·s" general_settings: "Réglages Généraux" form: @@ -3920,7 +3979,7 @@ fr_BE: taxons: form: name: Nom - permalink: permalien + permalink: 'Permalien : Nom pour URL (sans espace)' description: Description general_settings: edit: @@ -4113,6 +4172,8 @@ fr_BE: shipment: cannot_ready: "Impossible de préparer l'expédition." invalid_taxonomy_id: "Id taxonomique invalide." + unit: unité + per_unit: Montant par unité datetime: distance_in_words: about_x_hours: diff --git a/config/locales/fr_CA.yml b/config/locales/fr_CA.yml index 7f9b2fe62cc..32e382dc7ec 100644 --- a/config/locales/fr_CA.yml +++ b/config/locales/fr_CA.yml @@ -141,7 +141,8 @@ fr_CA: unprocessable_entity: title: "La modification réalisée a été rejetée (erreur 422)" message_html: "

La modification souhaitée a été refusée. Peut-être avez-vous essayé de faire quelque chose sans avoir les droits d'accès suffisants ?

Retourner à l'accueil

" - stimulus_reflex_error: "Nous sommes désolés mais quelque chose s'est mal passé.\n\n C'est un problème temporaire, merci donc de réessayer ou de recharger la page. \nNous enregistrons toutes les erreurs et travaillons sur les améliorations nécessaires.\nSi le problème persiste ou est urgent, merci de nous contacter.\n " + general_error: + message: "Nous sommes désolés mais quelque chose s'est mal passé.\n\n C'est un problème temporaire, merci donc de réessayer ou de recharger la page. \nNous enregistrons toutes les erreurs et travaillons sur les améliorations nécessaires.\nSi le problème persiste ou est urgent, merci de nous contacter.\n " stripe: error_code: incorrect_number: "e numéro de carte bancaire est incorrect." @@ -222,12 +223,16 @@ fr_CA: not_available_to_shop: "n'est pas disponible pour %{shop}" card_details: "Détalis de la carte" card_type: "Type de carte" + card_type_is: "Type de carte" + unrecognized_card_type: "Type de carte non reconnu" + use_new_cc: "Utilisez une nouvelle carte bancaire" + what_is_this: "Qu'est-ce que c'est ?" cardholder_name: "Titulaire de la carte" community_forum_url: "Lien vers le forum" customer_instructions: "Précisions pour l'acheteur" additional_information: "Informations additionnelles" connect_app: - url: "https://n8n.openfoodnetwork.org/webhook/regen-CAN/connect-enterprise" + url: "https://n8n.openfoodnetwork.org/webhook-test/food-justice/connect-enterprise" devise: passwords: spree_user: @@ -546,6 +551,7 @@ fr_CA: edit: Modifier clone: Dupliquer delete: Supprimer + remove: Supprimer image: edit: Modifier adjustments: @@ -650,6 +656,7 @@ fr_CA: status: Statut ok: Ok instance_secret_key: Clé Secrète de l'Instance + instance_publishable_key: Clé publique de l'instance account_id: Identifiant Compte business_name: Nom de l'entreprise charges_enabled: Frais activés @@ -771,6 +778,7 @@ fr_CA: index: header: title: Gestion du catalogue produits + content: loading: Vos produits sont en cours de chargement delete_modal: delete_product_modal: @@ -822,16 +830,19 @@ fr_CA: new_variant: Nouvelle variante bulk_update: success: Changements sauvegardés - edit_image: - title: Modifier la photo du produit - close: Retour - upload: Télécharger la photo delete_product: success: Le produit a bien été supprimé error: Le produit n'a pas pu être supprimé delete_variant: success: La variante a bien été supprimée error: La variante n'a pas pu être supprimée + variant_row: + none_tax_category: Aucun + search_for_tax_categories: "Chercher les catégories de taxes" + category_field_name: "Catégorie" + tax_category_field_name: "Type de taxe" + product_row: + producer_field_name: "Producteur" product_import: title: import produit file_not_found: Fichier non trouvé ou impossible à ouvrir @@ -2086,7 +2097,6 @@ fr_CA: label_account: "Compte" label_more: "Afficher plus" label_less: "Masquer" - label_notices: "Informations" cart_items: "Produits" cart_headline: "Votre panier" total: "Total" @@ -2498,6 +2508,7 @@ fr_CA: orders_bought_already_confirmed: "* déjà confirmé" orders_confirm_cancel: "Voulez-vous vraiment annuler cette commande ?" order_processed_successfully: "Votre commande a été traitée avec succès" + thank_you_for_your_order: "Merci pour votre commande" products_cart_distributor_choice: "Distributeur pour votre commande:" products_cart_distributor_change: "Vore distributeur pour cette commande sera dorénavant %{name} si vous ajoutez ce produit à votre panier." products_cart_distributor_is: "Votre distributeur pour cette commande est %{name}." @@ -3758,6 +3769,7 @@ fr_CA: editing_tax_category: "Modifier une catégorie de taxe" editing_tax_rate: "Modifier un taux" editing_zone: "Modifier une zone" + editing_state: "Editer la province" expiration: "Expiration" invalid_payment_provider: "Fournisseur de paiement invalide" items_cannot_be_shipped: "Les produits ne peuvent pas être envoyés" @@ -3796,6 +3808,7 @@ fr_CA: resend: "Renvoyer" back_to_orders_list: "Retour à la liste des commandes" back_to_payments_list: "Retour à la liste des paiements" + back_to_states_list: "Retour à la liste des provinces" return_authorizations: "Autorisations de retours" cannot_create_returns: "Impossible de créer une autorisation de retour car aucun produit n'a été livré pour cette commande." select_stock: "Sélectionner le stock" @@ -3998,6 +4011,11 @@ fr_CA: validation: must_be_int: "doit être un entier" admin: + images: + edit: + title: Modifier la photo du produit + close: Retour + upload: Télécharger la photo mail_methods: send_testmail: "Envoyer un e-mail de test" testmail: @@ -4025,6 +4043,10 @@ fr_CA: customers: "Acheteurs" groups: "Groupes" oidc_settings: "OIDC" + overview: "Aperçu" + product_import: "Importer" + enterprise_roles: "Roles" + payment_methods: "Méthodes de paiement" product_properties: index: inherits_properties_checkbox_hint: "Hériter des propriétés de %{supplier}? (non applicable si information de remplacement déjà saisie)" diff --git a/config/locales/fr_CH.yml b/config/locales/fr_CH.yml index f89193fb84f..005351987ef 100644 --- a/config/locales/fr_CH.yml +++ b/config/locales/fr_CH.yml @@ -467,6 +467,7 @@ fr_CH: edit: Modifier clone: Dupliquer delete: Supprimer + remove: Supprimer image: edit: Modifier adjustments: @@ -691,8 +692,12 @@ fr_CH: clear_search: Annuler la recherche table: new_variant: Nouvelle variante - edit_image: - close: Retour + variant_row: + none_tax_category: Aucun + category_field_name: "Catégorie" + tax_category_field_name: "TVA applicable" + product_row: + producer_field_name: "Producteur" product_import: title: Import liste produits file_not_found: Fichier non trouvé ou impossible à ouvrir @@ -1804,7 +1809,6 @@ fr_CH: label_account: "Compte" label_more: "Afficher plus" label_less: "Masquer" - label_notices: "Informations" cart_items: "Produits" cart_headline: "Votre panier" total: "Total" @@ -3669,6 +3673,9 @@ fr_CH: validation: must_be_int: "doit être un entier" admin: + images: + edit: + close: Retour mail_methods: send_testmail: "Envoyer un e-mail de test" testmail: @@ -3695,6 +3702,10 @@ fr_CH: enterprise_relationships: "Permissions" customers: "Acheteurs" groups: "Groupes" + overview: "Aperçu" + product_import: "Importer" + enterprise_roles: "Roles" + payment_methods: "Méthodes de paiement" product_properties: index: inherits_properties_checkbox_hint: "Hériter des propriétés de %{supplier} ? (non applicable si information de remplacement déjà saisie)" diff --git a/config/locales/fr_CM.yml b/config/locales/fr_CM.yml index 981cbe5f31c..b17ad8e5aba 100644 --- a/config/locales/fr_CM.yml +++ b/config/locales/fr_CM.yml @@ -404,6 +404,7 @@ fr_CM: edit: Modifier clone: Dupliquer delete: Supprimer + remove: Supprimer image: edit: Modifier adjustments: @@ -628,8 +629,12 @@ fr_CM: clear_search: Annuler la recherche table: new_variant: Nouvelle variante - edit_image: - close: Retour + variant_row: + none_tax_category: Aucun + category_field_name: "Catégorie" + tax_category_field_name: "TVA applicable" + product_row: + producer_field_name: "Producteur" product_import: title: Import liste produits file_not_found: Fichier non trouvé ou impossible à ouvrir @@ -1714,7 +1719,6 @@ fr_CM: label_account: "Compte" label_more: "Afficher plus" label_less: "Masquer" - label_notices: "Informations" cart_items: "Produits" cart_headline: "Votre panier" total: "Total" @@ -3563,6 +3567,9 @@ fr_CM: validation: must_be_int: "doit être un entier" admin: + images: + edit: + close: Retour mail_methods: send_testmail: "Envoyer un e-mail de test" testmail: @@ -3589,6 +3596,10 @@ fr_CM: enterprise_relationships: "Permissions" customers: "Acheteurs" groups: "Groupes" + overview: "Aperçu" + product_import: "Importer" + enterprise_roles: "Roles" + payment_methods: "Méthodes de paiement" product_properties: index: inherits_properties_checkbox_hint: "Hériter des propriétés de %{supplier} ? (non applicable si information de remplacement déjà saisie)" diff --git a/config/locales/hi.yml b/config/locales/hi.yml index 182872feb81..6958aec8f7b 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -137,7 +137,8 @@ hi: unprocessable_entity: title: "जो परिवर्तन आप चाहते थे वह नामंजूर कर दिया गया था (422)" message_html: "

जो परिवर्तन आप चाहते थे वह नामंजूर कर दिया गया था। शायद आपने ऐसा परिवर्तित करने की कोशिश की हो, जिस तक आपका एक्सेस नहीं है।

होम पर वापस जाएं

" - stimulus_reflex_error: "हमें माफ करें, लेकिन कुछ गलत हो गया।\n\nयह एक अस्थायी समस्या हो सकती है, इसलिए कृपया फिर से कोशिश करें या पेज को फिर से लोड करें।\nहम सभी त्रुटियों को रिकॉर्ड करते हैं और सम्भावित है की हम इसे ठीक करने पर काम कर रहे हों।\nयदि समस्या बनी रहती है या अत्यावश्यक है, तो कृपया हमसे संपर्क करें।" + general_error: + message: "हमें माफ करें, लेकिन कुछ गलत हो गया।\n\nयह एक अस्थायी समस्या हो सकती है, इसलिए कृपया फिर से कोशिश करें या पेज को फिर से लोड करें।\nहम सभी त्रुटियों को रिकॉर्ड करते हैं और सम्भावित है की हम इसे ठीक करने पर काम कर रहे हों।\nयदि समस्या बनी रहती है या अत्यावश्यक है, तो कृपया हमसे संपर्क करें।" stripe: error_code: incorrect_number: "कार्ड नंबर गलत है।" @@ -534,6 +535,7 @@ hi: edit: एडिट करें clone: क्लोन delete: हटाएं + remove: मिटाएँ image: edit: एडिट करें adjustments: @@ -752,6 +754,7 @@ hi: index: header: title: बल्क उत्पाद एडिट करें + content: loading: अपने उत्पादों को लोड कर रहा है filters: search_products: उत्पादों के लिए सर्च करें @@ -787,8 +790,12 @@ hi: reset: परिवर्तनों को अस्वीकार करें save: परिवर्तन सेव करें new_variant: नया वैरिएंट - edit_image: - close: वापस जाएं + variant_row: + none_tax_category: कोई नहीं + category_field_name: "श्रेणी" + tax_category_field_name: "टैक्स श्रेणी" + product_row: + producer_field_name: "उत्पादक" product_import: title: उत्पाद इम्पोर्ट करें file_not_found: फ़ाइल नहीं मिली या खोली नहीं जा सकी @@ -2005,7 +2012,6 @@ hi: label_account: "अकाउंट" label_more: "और दिखाएं" label_less: "कम दिखाएं" - label_notices: "नोटिस" cart_items: "आइटम्स" cart_headline: "आपका शॉपिंग कार्ट" total: "कुल" @@ -3875,6 +3881,9 @@ hi: validation: must_be_int: "पूर्णांक होना ही चाहिए" admin: + images: + edit: + close: वापस जाएं mail_methods: send_testmail: "टेस्ट ईमेल भेजें" testmail: @@ -3902,6 +3911,10 @@ hi: customers: "ग्राहक" groups: "ग्रुप्स" oidc_settings: "OIDC सेटिंग्स" + overview: "अवलोकन" + product_import: "इम्पोर्ट करें" + enterprise_roles: "भूमिकाएँ" + payment_methods: "भुगतान की विधियाँ" product_properties: index: inherits_properties_checkbox_hint: "%{supplier} से प्रॉपर्टीज़ इन्हेरिट करें? (जब तक कि ऊपर ओवरराइड न किया गया हो)" diff --git a/config/locales/hu.yml b/config/locales/hu.yml index a1a84a4054f..33ebc4d329e 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1,5 +1,8 @@ hu: language_name: "Angol" + time: + formats: + long: "%B %d, %Y %-l:%M %p" activerecord: models: spree/product: Termék @@ -8,12 +11,12 @@ hu: spree/order/ship_address: address1: "Szállítási cím (utca és házszám)" address2: "Szállítási cím 2. sor" - city: "Szállítási cím város" - country: "Szállítási cím ország" + city: "Szállítási cím Város" + country: "Szállítási cím Ország" phone: "Telefonszám" firstname: "Keresztnév" lastname: "Vezetéknév" - zipcode: "Szállítási cím irányítószám" + zipcode: "Szállítási cím Irányítószám" spree/order/bill_address: address1: "Számlázási cím (Utca és Házszám)" zipcode: "Számlázási cím Irányítószám" @@ -29,8 +32,8 @@ hu: enterprise_fee: fee_type: Díjtípus spree/order: - payment_state: Fizetési állapot - shipment_state: Szállítási állapot + payment_state: Fizetési státusz + shipment_state: Szállítási státusz completed_at: 'Elkészült:' number: Szám state: Ország @@ -40,12 +43,12 @@ hu: state: Ország source: Forrás spree/product: - name: "termék név" + name: "Termék Név" price: "Ár" primary_taxon: "Termékkategória" supplier: "Termelő" shipping_category_id: "Szállítási mód" - variant_unit: "Változatos egység" + variant_unit: "Változat egysége" variant_unit_name: "Változat egység neve" unit_value: "Egység értéke" spree/variant: @@ -58,19 +61,27 @@ hu: verification_value: "Ellenőrző érték" year: "Év" order_cycle: - orders_close_at: Lezárási dátum + orders_close_at: Lezárás dátuma variant_override: count_on_hand: "Készlet" + spree/payment_method/calculator: + preferred_additional_item: "További tételek kalkulált költsége:" + enterprise: + white_label_logo_link: "A főoldalon használt logo linkje" errors: models: + spree/image: + attributes: + attachment: + integrity_error: "a betöltés nem sikerült. Kérjük, ellenőrizd, hogy a fájl nem sérült-e, és próbáld meg újra." spree/user: attributes: email: - taken: "Már létezik fiók ehhez az e-mailhez. Kérjük, jelentkezzen be, vagy állítsa vissza jelszavát." + taken: "Már létezik fiók ehhez az e-mailhez. Kérjük, jelentkezz be, vagy állítsd vissza a jelszavad." reset_password_token: invalid: érvénytelen spree/order: - no_card: Nincsenek engedélyezett hitelkártyák a terhelésre + no_card: Nincsenek engedélyezett hitelkártyák a terhelés elvégzésére spree/credit_card: attributes: base: @@ -86,14 +97,40 @@ hu: limited_stock_but_no_count_on_hand: "meg kell adni, mert korlátozott a készlet" messages: blank: "nem lehet üres" + too_short: "túl rövid (minimum %{count}karakter)" errors: messages: - file_size_out_of_range: "a 1%{file_size} mérete nem esik bele a kívánt tartományba" + content_type_invalid: "érvénytelen tartalom típus" + file_size_out_of_range: "a %{file_size} mérete nem esik bele a kívánt tartományba" limit_out_of_range: "az összmenyiség kívül esik a megengedett tartományon" image_metadata_missing: "nem használható kép" + dimension_min_inclusion: "legyen nagyobb vagy egyenlő %{width} x %{height} pixel" + dimension_max_inclusion: "legyen kisebb vagy egyenlő %{width} x %{height} pixel" + dimension_width_inclusion: "a szélesség nincs %{min} és %{max} pixel közt" + dimension_height_inclusion: "magasság nincs %{min} és %{max} pixel között" + dimension_width_greater_than_or_equal_to: "a szélesség legyen nagyobb vagy egyenlő %{length} pixel" + dimension_height_greater_than_or_equal_to: "a magasság legyen nagyobb vagy egyenlő %{length} pixel" + dimension_width_less_than_or_equal_to: "a szélesség legyen kisebb vagy egyenlő %{length} pixel" + dimension_height_less_than_or_equal_to: "a magasság legyen kisebb vagy egyenlő %{length} pixel" + dimension_width_equal_to: "a szélesség legyen egyenlő %{length} pixel" + dimension_height_equal_to: "a magasság legyen egyenlő %{length} pixel" aspect_ratio_not_square: "négyzet alakú képnek kell lennie" aspect_ratio_not_portrait: "portré képnek kell lennie" + aspect_ratio_not_landscape: "fekvő tájolású kép legyen" + aspect_ratio_is_not: "%{aspect_ratio} arányú legyen" + aspect_ratio_unknown: "ismeretlen arány" image_not_processable: "nem használható kép" + not_found: + title: "A keresett oldal nem található! (404)" + message_html: "Kérlek, próbáld újra!

Ez lehet egy átmeneti probléma. Kérlek, kattints a vissza gombra, hogy visszatérj az előző képernyőre, vagy menj vissza a(z) Kezdőlapra és próbáld újra.

Fordulj az Ügyfélszolgálathoz.

Ha a probléma továbbra is fennáll, vagy sürgős, kérjük, értesíts minket róla. Elérhetőségeinket a globális Open Food Network helyi oldalán találod.

Nagy segítség, ha minél több részletet meg tudsz adni a nem található oldalról.

" + internal_server_error: + title: "Sajnáljuk! Hiba történt (500)" + message_html: "Kérjük, próbáld újra. Ez lehet egy átmeneti probléma. Kérjük, kattints a Vissza gombra, hogy visszatérj az előző képernyőre, vagy menjen vissza a Kezdőlapra és próbáld újra.

Dolgozunk rajta

Ha már korábban is találkoztál ezzel a problémával, valószínűleg már tudunk róla és dolgozunk a megoldáson. Minden felmerülő hibát rögzítünk.

Fordulj az Ügyfélszolgálathoz

Ha a probléma továbbra is fennáll, vagy sürgős, kérjük, értesíts minket róla. Elérhetőségeinket a helyi Open Food Network oldalon találod.

Nagy segítség, ha minél több részletet meg tudsz adni arról, hogy mit csinált, amikor ez a hiba felmerült.

" + unprocessable_entity: + title: "A művelet nem végrehajtható (422)" + message_html: "

A művelet nem végrehajtható. Lehet, hogy olyan műveletet szeretnél végrehajtani, amihez nincs jogosultságod.

Vissza a Kezdőlapra

" + general_error: + message: "Sajnáljuk! Hiba történt.\n\nEz lehet egy átmeneti probléma. Kérjük, próbáld újra, vagy frissítsd az oldalt.\nMinden felmerülő hibát rögzítünk és valószínűleg már dolgozunk rajta.\nHa a probléma továbbra is fennáll, vagy sürgős, kérjük, értesíts minket róla. " stripe: error_code: incorrect_number: "A kártyaszám hibás." @@ -124,7 +161,7 @@ hu: invalid_account: "A kártya vagy fiók, amelyhez a kártya kapcsolódik, érvénytelen." invalid_amount: "A befizetés összege érvénytelen, vagy meghaladja a megengedett összeget." invalid_pin: "A megadott PIN-kód helytelen. Ez az elutasító kód csak a kártyaolvasóval történő fizetésekre vonatkozik." - issuer_not_available: "kártyakibocsátót nem sikerült elérni, így a fizetést nem sikerült engedélyezni." + issuer_not_available: "A kártyakibocsátót nem sikerült elérni, így a fizetést nem sikerült engedélyezni." lost_card: "A fizetést elutasították, mert a kártya elveszett." merchant_blacklist: "A fizetést elutasították, mert megegyezik a Stripe felhasználó tiltólistáján szereplő értékkel." new_account_information_available: "A kártya vagy fiók, amelyhez a kártya kapcsolódik, érvénytelen." @@ -133,7 +170,7 @@ hu: offline_pin_required: "A kártyát elutasították, mivel PIN kódot igényel." online_or_offline_pin_required: "A kártyát elutasították, mivel PIN kódot igényel." pickup_card: "A kártya nem használható erre a fizetésre (lehetséges, hogy elveszett vagy ellopták)." - pin_try_exceeded: "Túllépte a PIN-kód próbálkozások megengedett számát." + pin_try_exceeded: "Túllépted a PIN-kód próbálkozások megengedett számát." reenter_transaction: "A kifizetést a kibocsátó ismeretlen okból nem tudta feldolgozni." restricted_card: "A kártya nem használható erre a fizetésre (lehetséges, hogy elveszett vagy ellopták)." revocation_of_all_authorizations: "A kártyát ismeretlen okból elutasították." @@ -146,6 +183,9 @@ hu: transaction_not_allowed: "A kártyát ismeretlen okból elutasították." try_again_later: "A kártyát ismeretlen okból elutasították." withdrawal_count_limit_exceeded: "Az ügyfél túllépte a kártyáján rendelkezésre álló egyenleget vagy hitelkeretet." + disconnect_failure: "Sikertelen a Stripe kapcsolat megszakítása." + success_code: + disconnected: "A Stripe fiók kapcsolat megszakadt." activemodel: errors: messages: @@ -154,7 +194,7 @@ hu: order_management/subscriptions/validator: attributes: subscription_line_items: - at_least_one_product: "^Kérjük, adjon hozzá legalább egy terméket" + at_least_one_product: "^Kérjük, adj hozzá legalább egy terméket" not_available: "^%{name} nem érhető el a kiválasztott ütemezésből" ends_at: after_begins_at: "után kell lennie, ekkor kezdődik" @@ -164,13 +204,17 @@ hu: not_coordinated_by_shop: "nem a %{shop} koordinálja" payment_method: not_available_to_shop: "nem érhető el a %{shop} számára" - invalid_type: "Cash vagy Stripe módszernek kell lennie" + invalid_type: "Készpénz vagy Stripe fizetési módnak kell lennie" charges_not_allowed: "^Ez az ügyfél nem engedélyezi a hitelkártya-terhelést" no_default_card: "^Ennél az ügyfélnél nem áll rendelkezésre alapértelmezett kártya" shipping_method: not_available_to_shop: "nem érhető el a %{shop} számára" card_details: "A kártya adatai" card_type: "Kártyatípus" + card_type_is: "A kártya típusa: " + unrecognized_card_type: "Nem azonosítható kártyatípus" + use_new_cc: "Használj egy másik bankkártyát" + what_is_this: "Mi ez?" cardholder_name: "Kártyatulajdonos neve" community_forum_url: "A közösségi fórum URL-je" customer_instructions: "Vevői utasítások" @@ -178,39 +222,41 @@ hu: devise: passwords: spree_user: - cannot_be_blank: "A felhasználói jelszó mező nem lehet üres. Adjon meg egy jelszót." + cannot_be_blank: "A felhasználói jelszó mező nem lehet üres. Adj meg egy jelszót." confirmations: - send_instructions: "Néhány percen belül e-mailt fog kapni a fiók megerősítéséhez szükséges utasításokkal." + send_instructions: "Néhány percen belül e-mailt fogsz kapni a fiók megerősítéséhez szükséges utasításokkal." failed_to_send: "Hiba történt a megerősítő e-mail elküldése közben." resend_confirmation_email: "Küldd újra a megerősítő email-t." - confirmed: "Köszönjük, hogy megerősítette e-mailjét! Most már bejelentkezhet." - not_confirmed: "Az e-mail címét nem sikerült megerősíteni. Talán már befejezte ezt a lépést?" + confirmed: "Köszönjük, hogy megerősítetted az e-mailedet! Most már bejelentkezhetsz." + not_confirmed: "Az e-mail címed nem sikerült megerősíteni. Talán már befejezted ezt a lépést?" user_confirmations: spree_user: - send_instructions: "Néhány percen belül e-mailt fog kapni a fiók megerősítéséhez szükséges utasításokkal." + send_instructions: "Néhány percen belül e-mailt fogsz kapni a fiók megerősítéséhez szükséges utasításokkal." confirmation_sent: "E-mail visszaigazolás elküldve" confirmation_not_sent: "Hiba a megerősítő e-mail küldésekor" user_registrations: spree_user: signed_up_but_unconfirmed: "Megerősítő linket tartalmazó üzenetet küldtünk az e-mail címedre. Kérjük, nyisd meg a linket a fiók aktiválásához." - unknown_error: "Hiba történt a fiók létrehozásakor. Ellenőrizze e-mail címét, és próbálja újra." + unknown_error: "Hiba történt a fiók létrehozásakor. Ellenőrizd e-mail címed, és próbáld újra." failure: disabled: "A fiókot inaktiváltuk. Kérünk fordulj munkatársunkhoz, hogy feloldjuk." invalid: | - Invalid email or password.: Rossz email cím vagy jelszó. - Were you a guest last time? Perhaps you need to create an account or reset your password.: Vendég voltál legutóbb? Lehet, hogy fiókot kell létrehoznia, vagy vissza kell állítania jelszavát. - unconfirmed: "A folytatás előtt meg kell erősítenie fiókját." - already_registered: "Ez az email cím már regisztrálva van. Kérjük, jelentkezzen be a folytatáshoz, vagy lépjen vissza, és használjon másik e-mail címet." + Rossz email cím vagy jelszó. + Legutóbb is vendégként használtad a felületet? Talán létre kell hoznod egy fiókot vagy vissza kell állítanod a jelszavad: + unconfirmed: "A folytatás előtt meg kell erősítened a fiókod." + already_registered: "Ez az email cím már regisztrálva van. Kérjük, jelentkezz be a folytatáshoz, vagy lépj vissza, és használj másik e-mail címet." success: logged_in_succesfully: "Sikeresen bejelentkeztél" sessions: - signed_out: "Sikeresen kijelentkezett." - already_signed_out: "Sikeresen kijelentkezett." + signed_out: "Sikeresen kijelentkeztél." + already_signed_out: "Sikeresen kijelentkeztél." user_passwords: spree_user: - updated_not_active: "Jelszava visszaállításra került, de e-mail-címét még nem erősítették meg." + updated_not_active: "Jelszavad visszaállításra került, de az e-mail-címed még nem erősítették meg." updated: "Jelszavad sikeresen megváltozott, és bejelentkeztél." - send_instructions: "Néhány percen belül e-mailt fog kapni a fiók megerősítéséhez szükséges utasításokkal." + send_instructions: "Néhány percen belül e-mailt fogsz kapni a fiók megerősítéséhez szükséges utasításokkal." + oidc: + failure: "Nem tudtál bejelentkezni: %{error}" home_page_alert_html: "Kezdőlap figyelmeztető HTML" hub_signup_case_studies_html: "Átvételi pont regisztrációs esettanulmányok HTML" hub_signup_detail_html: "Átvételi pont regisztrációs részletek HTML" @@ -228,18 +274,18 @@ hu: menu_7_icon_name: "7. menü ikon neve" models: order_cycle: - cloned_order_cycle_name: "%{order_cycle} MÁSOLA" + cloned_order_cycle_name: "%{order_cycle} MÁSOLATA" tax_rate: included_in_price: "Az ár tartalmazza" - open_street_map_enabled: "Az Utcatérkép megnyitása engedélyezve" - open_street_map_default_latitude: "Nyissa meg az Utcatérkép alapértelmezett szélességi fokát" - open_street_map_default_longitude: "Nyissa meg az Utcatérkép alapértelmezett hosszúságát" - open_street_map_provider_name: "Nyissa meg az Utcatérkép-szolgáltató nevét" - open_street_map_provider_options: "Nyissa meg az Utcatérkép-szolgáltató beállításait" + open_street_map_enabled: "Az Open Street Map megnyitása engedélyezve" + open_street_map_default_latitude: "Open Street Map alapértelmezett szélességi fok" + open_street_map_default_longitude: "Open Street Map alapértelmezett hosszúsági fok" + open_street_map_provider_name: " Open Street Map szolgáltató neve" + open_street_map_provider_options: "Open Street Map szolgáltató beállításai" producer_signup_case_studies_html: "Termelői regisztrációs esettanulmányok HTML" - producer_signup_detail_html: "Termelői regisztrációs részletek HTML" + producer_signup_detail_html: "Termelői regisztráció részletek HTML" producer_signup_pricing_table_html: "Termelői regisztrációs ártáblázat HTML" - producers_social: "Szociális szövetkezetek" + producers_social: "Termelői szövetkezet" resume_order: "Rendelés folytatása" sku: "SKU" subtotal: "Részösszeg" @@ -251,18 +297,22 @@ hu: integer_array_validator: not_array_error: "tömbnek kell lennie" invalid_element_error: "csak érvényes egész számokat tartalmazhat" + report_job: + report_failed: | + Ez a lekérdezés nem sikerült. Lehet, hogy túl nagy a feldolgozáshoz. + Megvizsgáljuk, de kérjük, értesíts minket, ha a probléma továbbra is fennáll. enterprise_mailer: confirmation_instructions: - subject: "Kérjük, erősítse meg %{enterprise} e-mail címét" + subject: "Kérjük, erősítsd meg %{enterprise} e-mail címét" welcome: subject: "%{enterprise} most itt van: %{sitename}" - email_welcome: "Üdvözöljük" + email_welcome: "Üdvözlünk" email_registered: "most része" email_userguide_html: "A Termelő vagy Átvételi pont beállításához szükséges részletes támogatást tartalmazó felhasználói útmutató itt található: %{link}" - userguide: "Nyissa meg a Food Network felhasználói kézikönyvét" - email_admin_html: "Fiókját úgy kezelheti, hogy bejelentkezik a %{link} oldalra, vagy kattintson a kezdőlap jobb felső sarkában lévő fogaskerékre, és válaszd az Adminisztráció lehetőséget." + userguide: "Nyissa meg az Open Food Network felhasználói kézikönyvét" + email_admin_html: "Fiókod úgy kezelheted, hogy bejelentkezel a %{link} oldalra, vagy kattints a kezdőlap jobb felső sarkában lévő fogaskerékre, és válaszd az Adminisztráció lehetőséget." admin_panel: "Adminisztrációs Panel" - email_community_html: "Van egy online fórumunk is az OFN szoftverrel és az élelmiszeripari vállalkozás vezetésének egyedi kihívásaival kapcsolatos közösségi vitákhoz. Arra biztatjuk, hogy csatlakozzon. Folyamatosan fejlődünk, és az Ön hozzájárulása ehhez a fórumhoz meghatározza, hogy mi történik ezután. %{link}" + email_community_html: "Van egy online fórumunk is az OFN szoftverrel és az élelmiszeripari vállalkozás vezetésének egyedi kihívásaival kapcsolatos közösségi vitákhoz. Arra bíztatunk, hogy csatlakozz. Folyamatosan fejlődünk, és a Te hozzájárulásod ehhez a fórumhoz meghatározza, hogy mi történik ezután. %{link}" join_community: "Csatlakozz a közösséghez" invite_manager: subject: "%{enterprise} meghívott téged menedzsernek" @@ -274,13 +324,16 @@ hu: report_ready: subject: "A jelentés kész" heading: "A jelentés letöltésre kész" + intro: | + Az alábbi link egy hét múlva érvényét veszti. + link_label: "%{name}" shipment_mailer: shipped_email: - dear_customer: "Tisztelt Ügyfelünk," - instructions: "Megrendelését kiszállították" + dear_customer: "Kedves Ügyfelünk," + instructions: "Megrendelésed kiszállították" shipment_summary: "Szállítási összefoglaló" subject: "Szállítási értesítés" - thanks: "Köszönjük csatlakozását." + thanks: "Köszönjük, hogy csatlakoztál!" track_information: "Nyomon követési információ: %{tracking}" track_link: "Nyomon követési link: %{url}" subscription_mailer: @@ -294,8 +347,8 @@ hu: intro: "Az alábbiakban összefoglaljuk azokat az előfizetési rendeléseket, amelyeket most véglegesítettek a %{shop} számára." summary_overview: total: Összesen %{count} előfizetést jelöltek meg automatikus feldolgozásra. - success_zero: Ezeknek a,egyiket sem sikerült feldolgozni. - success_some: Ezeknek a, %{count} sikeresen feldolgozva. + success_zero: Egyiket sem sikerült feldolgozni. + success_some: Ezeknek a, %{count}-a sikeresen feldolgozva. success_all: Mindegyik sikeresen feldolgozásra került. issues: A felmerült problémák részleteit alább közöljük. summary_detail: @@ -305,7 +358,7 @@ hu: explainer: Ezeket a rendeléseket feldolgoztuk, de néhány kért cikkhez nem állt rendelkezésre elegendő készlet empty: title: Nincs raktáron (%{count} rendelés) - explainer: Ezeket a rendeléseket nem tudtuk feldolgozni, mert nem volt készlet a kért cikkekhez + explainer: Ezeket a rendeléseket nem tudtuk feldolgozni, mert nem volt készlet a kért termékekből complete: title: Már feldolgozva (%{count} rendelés) explainer: Ezeket a rendeléseket már késznek jelölték, és ezért érintetlenül maradtak @@ -314,16 +367,16 @@ hu: explainer: Ezen rendelések automatikus feldolgozása hiba miatt meghiúsult. A hiba lehetőség szerint fel lett sorolva. failed_payment: title: Sikertelen fizetés (%{count} megrendelés) - explainer: Ezen rendelések fizetésének automatikus feldolgozása hiba miatt meghiúsult. A hiba lehetőség szerint fel lett sorolva. + explainer: Ezen rendelések fizetésének automatikus feldolgozása hiba miatt meghiúsult. A hiba feltüntetésre került, ahol lehetséges. other: title: Egyéb hiba (%{count} rendelés) - explainer: megrendelések automatikus feldolgozása ismeretlen okból meghiúsult. Ennek nem szabadna előfordulnia," kérjük lépjen kapcsolatba velünk, ha ezt látja. + explainer: A megrendelések automatikus feldolgozása ismeretlen okból meghiúsult. Ennek nem szabadna előfordulnia, kérjük lépj kapcsolatba velünk, ha ezt látod. home: "OFN" title: "Open Food Network" welcome_to: "Üdvözli az" - site_meta_description: "Az alapoktól kezdjük. A gazdálkodókkal és termelőkkel, akik készen állnak arra, hogy büszkén és őszintén elmondják történeteiket. A forgalmazókkal, akik készen állnak arra, hogy tisztességesen és becsületesen összekapcsolják az embereket a termékekkel. Azokkal a vásárlókkal, akik hisznek abban, hogy jobb heti vásárlási döntések…" + site_meta_description: "Az alapoktól kezdjük. A gazdálkodókkal, akiknek fontos, hogy közösen, egy fenntartható és mindenki számára átlátható, hazai élelemrendszert hozzunk létre. A bevásárlóközösségekkel, fogyasztói csoportokkal, forgalmazókkal, akik összekapcsolják az embereket a termelőkkel és a termékekkel, és biztosítani szeretnék, hogy a termelők tisztességes díjazásban részesüljenek. Azokkal a fogyasztókkal, akik hisznek abban, hogy döntéseiknek hatása van." search_by_name: Keresés név vagy település szerint... - producers_join: Az ausztrál termelők most már csatlakozhatnak az Open Food Networkhöz. + producers_join: Az magyar termelők most már csatlakozhatnak az Open Food hálózatához. charges_sales_tax: Áfaköteles? business_address: "Vállalkozás címe" print_invoice: "Számla nyomtatása" @@ -336,31 +389,35 @@ hu: ship_order: "Szállítási rendelés" cancel_order: "Megrendelés visszavonása" confirm_send_invoice: "Erről a megrendelésről számlát küldünk a vásárlónak. Biztos, hogy akarod folytatni?" - confirm_resend_order_confirmation: "Biztos, hogy újra el akarja küldeni a rendelést visszaigazoló e-mailt?" + confirm_resend_order_confirmation: "Biztos, hogy újra el akarod küldeni a rendelést visszaigazoló e-mailt?" + must_have_valid_business_number: "%{enterprise_name}a számlázás igénybevételéhez érvényes ABN-nel kell rendelkeznie." invoice: "Számla" + invoices: "Számlák" + file: "File" active: "Aktív" + download: "Letöltés" cancelled: "Törölve" more: "Több" say_no: "Nem" say_yes: "Igen" ongoing: Folyamatban lévő - bill_address: számlázási cím - ship_address: szállítási cím - sort_order_cycles_on_shopfront_by: "Rendezési ciklusok rendezése a átvételi pontban:" + bill_address: Számlázási cím + ship_address: Szállítási cím + sort_order_cycles_on_shopfront_by: "Rendelési ciklusok rendezése a átvételi pontban az alábbi szerint:" required_fields: A kötelező mezőket csillag jelöli - select_continue: Válassz a fentiek közül és kattints - remove: Távolítsa el + select_continue: Válassz és Folytasd + remove: Eltávolítás collapse_all: Mindet összecsuk expand_all: Az összes kibontása loading: Betöltés... show_more: Mutass többet show_all: Mutasd az összeset show_all_with_more: "Az összes megjelenítése (további %{num})" - cancel: Vissza + cancel: Törlés edit: Szerkesztés clone: Klón distributors: Forgalmazók - distribution: terjesztés + distribution: Forgalmazás order_cycles: Rendelési ciklusok bulk_order_management: Tömeges megrendelés kezelése enterprises: Vállalkozások @@ -390,30 +447,31 @@ hu: 'no': "Nem" y: 'Y''' n: 'N''' - powered_by: Powered by - blocked_cookies_alert: "Előfordulhat, hogy az Ön böngészője blokkolja az oldal használatához szükséges cookie-kat. Kattintson az alábbi gombra a cookie-k engedélyezéséhez és az oldal újratöltéséhez." + powered_by: 'Készült a ' + blocked_cookies_alert: "Előfordulhat, hogy a böngésződ blokkolja az oldal használatához szükséges cookie-kat. Kattints az alábbi gombra a cookie-k engedélyezéséhez és az oldal újratöltéséhez." allow_cookies: "Cookie-k engedélyezése" none: Egyik sem notes: Megjegyzések error: Hiba + voucher: Utalvány processing_payment: "Fizetés feldolgozása..." no_pending_payments: "Nincsenek függőben lévő kifizetések" - invalid_payment_state: "Érvénytelen fizetési állapot: %{state}" + invalid_payment_state: "Érvénytelen fizetési státusz: %{state}" filter_results: Eredmények szűrése clear_filters: Szűrők törlése quantity: Mennyiség pick_up: Átvétel - ok: rendben + ok: OK copy: Másolat - change_my_password: "Változtasd meg a jelszavamat" - update_password: "Frissítse a jelszót" + change_my_password: "Jelszó megváltoztatása" + update_password: "Frissítsd a jelszót" password_confirmation: Jelszó megerősítése reset_password_token: Jelszó token visszaállítása - expired: lejárt, kérjen újat + expired: lejárt, kérj újat back_to_payments_list: "Vissza a fizetési listához" maestro_or_solo_cards: "Maestro/Solo kártyák" backordered: "Hátrarendelt" - on_hand: "Készlet" + on_hand: "Raktáron" on hand: "Készlet" ship: "Szállítás" shipping_category: "Szállítási mód" @@ -425,8 +483,8 @@ hu: actions: create_and_add_another: "Hozz létre és adj hozzá egy másikat" create: "Létrehozás" - cancel: "Vissza" - resume: "Vissza" + cancel: "Törlés" + resume: "Összefoglaló" save: "Mentés" edit: "Szerkesztés" update: "Frissítés" @@ -442,18 +500,22 @@ hu: filters: categories: title: Kategóriák + selected_categories: "%{count}kategóriák kiválasztva" producers: title: Termelők + selected_producers: "%{count}termelő kiválasztva" + per_page: "%{count}item/oldal" colums: Oszlopok columns: name: Név unit: Mértékegység unit_value: Egység értéke + display_as: Egység megjelenítése mint price: Ár producer: Termelő category: Kategória - sku: SKU - on_hand: "Készlet" + sku: SKU kód + on_hand: "Raktáron" on_demand: "Igény szerint" tax_category: "Adókategória" inherits_properties: "Megörökli az tulajdonságokat?" @@ -464,8 +526,8 @@ hu: price: Ár producer: Termelő category: Kategória - sku: SKU - on_hand: "Készlet" + sku: SKU kód + on_hand: "Raktáron" on_demand: "Igény szerint" tax_category: "Adókategória" inherits_properties: "Megörökli az tulajdonságokat?" @@ -474,10 +536,11 @@ hu: edit: Szerkesztés clone: Klón delete: Töröl + remove: Eltávolítás image: edit: Szerkesztés adjustments: - skipped_changing_canceled_order: "A törölt rendelést nem módosíthatja." + skipped_changing_canceled_order: "A törölt rendelést nem módosíthatod." begins_at: 'Kezdete:' begins_on: Kezdődik bill_address: "Számla címe" @@ -518,17 +581,17 @@ hu: clear_all: Mindent kitöröl start_date: "Kezdő dátum" end_date: "Befejezés dátuma" - unsaved_changes: "Nem mentett módosításai vannak" + unsaved_changes: "Nem mentett módosításaid vannak" form_invalid: "Az űrlap hiányzó vagy érvénytelen mezőket tartalmaz" clear_filters: Szűrők törlése clear: Törlés save: Mentés - cancel: Vissza + cancel: Törlés back: Vissza show_more: Mutass többet show_n_more: 'További %{num} ' - choose: "Választ..." - please_select: Kérlek, válassz... + choose: "Választás..." + please_select: Kérjük, válassz... column_save_as_default: Mentés alapértelmezettként columns: Oszlopok actions: Akciók @@ -538,15 +601,18 @@ hu: tag_has_rules: "Meglévő szabályok ehhez a címkéhez: %{num}" has_one_rule: "egy szabálya van" has_n_rules: "%{num} szabálya van" - unsaved_confirm_leave: "Ezen az oldalon vannak nem mentett módosítások. Folytatás mentés nélkül?" + unsaved_confirm_leave: "Ezen az oldalon vannak nem mentett módosítások. Folytatod mentés nélkül?" available_units: "Rendelkezésre álló egységek" + terms_of_service_have_been_updated_html: "Az Open Food Network Általános Szerződési Feltételek frissítésre kerültek: %{tos_link}" + terms_of_service: Olvasd el az Általános Szerződési Feltételeket + accept_terms_of_service: Az Általános Szerződési Feltételek elfogadása shopfront_settings: embedded_shopfront_settings: "Beágyazott kirakatbeállítások" enable_embedded_shopfronts: "Beágyazott kirakatok engedélyezése" embedded_shopfronts_whitelist: "Külső domainek engedélyezési listája" terms_of_service_files: create: - select_file: "Kérjük, először válasszon egy fájlt." + select_file: "Kérjük, először válassz egy fájlt." show: title: "Szolgáltatási feltételek fájlok" no_files: "Még nem töltöttek fel szolgáltatási feltételeket." @@ -572,10 +638,10 @@ hu: stripe_connect_enabled: Engedélyezi az átadópontok számára a fizetés elfogadását a Stripe Connect használatával? no_api_key_msg: Ehhez a vállalkozáshoz nem tartozik Stripe-fiók. configuration_explanation_html: A Stripe Connect integráció konfigurálására vonatkozó részletes utasításokért, kérjük, olvasd el ezt az útmutatót. - status: Állapot + status: Státusz ok: Rendben instance_secret_key: Példány titkos kulcsa - account_id: felhasználónév + account_id: Felhasználónév business_name: Vállalkozás neve charges_enabled: Díjak engedélyezve charges_enabled_warning: "Figyelmeztetés: A terhelések nem engedélyezettek az Ön fiókjában" @@ -595,11 +661,11 @@ hu: new_customer: "Új vevő" code: Kód duplicate_code: "Ez a kód már használatban van." - bill_address: "számlázási cím" - ship_address: "szállítási cím" - balance: "Egyensúly" + bill_address: "Számlázási cím" + ship_address: "Szállítási cím" + balance: "Mérleg" update_address_success: "A cím sikeresen frissítve." - update_address_error: "Sajnálom! Kérjük, töltse ki az összes kötelező mezőt!" + update_address_error: "Sajnáljuk! Kérjük, töltsd ki az összes kötelező mezőt!" edit_bill_address: "Számlázási cím szerkesztése" edit_ship_address: "Szállítási cím szerkesztése" required_fileds: "A kötelező mezőket csillag jelöli" @@ -627,6 +693,10 @@ hu: your_content: Az Ön tartalma user_guide: Használati útmutató map: Térkép + dfc_product_imports: + index: + title: "DFC termékkatalógus importálása" + imported_products: "Importált termékek:" enterprise_fees: index: title: "Vállalkozási díjak" @@ -634,10 +704,10 @@ hu: fee_type: "Díjtípus" name: "Név" tax_category: "Adókategória" - calculator: "Kiszámítási mód" - calculator_values: "Kiszámítási mód" + calculator: "Kalkulátor" + calculator_values: "Kalkulátor értékei" search: "Keresés" - name_placeholder: "pl csomagolási díj" + name_placeholder: "pl. csomagolási díj" enterprise_groups: index: new_button: Új vállalkozási csoport @@ -671,19 +741,19 @@ hu: upload_an_image: Tölts fel egy képet seo: product_search_keywords: "Termékkeresési kulcsszavak" - product_search_tip: "Írjon be olyan szavakat, amelyek megkönnyítik a termékek keresését az oldalon. Használjon szóközt az egyes kulcsszavak elválasztásához." - seo_tip: "Írjon be olyan szavakat, amelyek megkönnyítik termékei keresését az interneten. Használjon szóközt az egyes kulcsszavak elválasztásához." + product_search_tip: "Írj be olyan szavakat, amelyek megkönnyítik a termékek keresését az oldalon. Használj szóközt az egyes kulcsszavak elválasztásához." + seo_tip: "Írj be olyan szavakat, amelyek megkönnyítik termékek keresését az interneten. Használj szóközt az egyes kulcsszavak elválasztásához." search: "Keresés" properties: property_name: "Tulajdonság neve" inherited_property: "Öröklött tulajdonság" variants: - infinity: "végtelenség" - to_order_tip: "rendelésre készült termékeknek nincs meghatározott készletszintjük, például a rendelésre frissen készült kenyérnek." + infinity: "Végtelen" + to_order_tip: "A megrendelésre készült termékeknek nincs meghatározott készletszintjük, például a rendelésre frissen készült kenyérnek." back_to_products_list: "Vissza a termékek listájához" editing_product: "Termék szerkesztése" tabs: - product_details: "termék leírás" + product_details: "Termék leírás" group_buy_options: "Csoportos vásárlási lehetőségek" images: "Képek" variants: "Változatok" @@ -692,14 +762,25 @@ hu: index: header: title: Termékek tömeges szerkesztése + content: + loading: Termékeid betöltése delete_modal: delete_product_modal: heading: "Termék törlése" + prompt: "Ezzel véglegesen eltávolítod a listáról." confirmation_text: "Termék törlése" + cancellation_text: "A termék megtartása" delete_variant_modal: heading: "Változat törlése" + prompt: "Ezzel véglegesen eltávolítod a listáról." confirmation_text: "Változat törlése" + cancellation_text: "Változat megtartása" filters: + search_products: Keresés a termékek között + search_for_producers: Keresés termelőre + all_producers: Minden termelő + search_for_categories: Keresés termékkategóriára + all_categories: Minden kategória producers: label: Termelők categories: @@ -707,29 +788,46 @@ hu: search: Keresés sort: pagination: + total_html: "%{total} terméket találtunk a keresési feltételek alapján. %{from}-től %{to}-ig mutat." + per_page: + show: Mutasd + per_page: "%{num}per oldal" clear_search: Keresés törlése + no_products: + no_products_found: Nem találtunk termékeket + import_products: Több termék importálása + no_products_found_for_search: Nem találtunk a keresési feltételeknek megfelelő termékeket table: + changed_summary: + one: "%{count} termék módosítva." + other: "%{count} termék módosítva." error_summary: saved: - one: "a termék helyesen lett elmentve, de" - other: "a termékek helyesen lettek elmentve, de" + one: "%{count}termék helyesen lett elmentve, de" + other: "%{count} termékek helyesen lettek elmentve, de" + reset: Változások elvetése save: Változások mentése new_variant: Új variáns bulk_update: success: Változtatások mentve - edit_image: - close: Vissza delete_product: success: Sikeresen törölte a terméket error: A terméket nem lehet törölni delete_variant: - success: Sikeresen törölte a terméket + success: Sikeresen törölte a termék változatot error: A változatot nem lehet törölni + variant_row: + none_tax_category: Egyik sem + search_for_tax_categories: "Keresés adókategóriára." + category_field_name: "Kategória" + tax_category_field_name: "Adókategória" + product_row: + producer_field_name: "Termelő" product_import: title: Termék importálása file_not_found: A fájl nem található vagy nem nyitható meg no_data: Nem található adat a táblázatban - confirm_reset: "Ezzel nullára állítja a készletszintet az n vállalkozás összes olyan termékénél, amely nem szerepel a feltöltött fájlban" + confirm_reset: "Ezzel nullára állítod a készletszintet az \nvállalkozás összes olyan termékénél, amely nem szerepel a feltöltött fájlban" model: no_file: "hiba: nincs fájl feltöltve" could_not_process: "nem sikerült feldolgozni a fájlt: érvénytelen fájltípus" @@ -737,13 +835,15 @@ hu: conditional_blank: nem lehet üres, ha a unit_type mező üres no_product: nem talált egy terméket sem az adatbázisban not_found: nem található az adatbázisban + category_not_found: nem felel meg az engedélyezett kategóriáknak. Nézd meg a helyes kategóriákat, amelyek közül választhatsz a termékimport oldalról, vagy ellenőrizd, hogy nincs-e helyesírási hiba. not_updatable: nem frissíthető a meglévő termékeken termékimporttal + values_must_be_same: azonos név alatt azonos terméknek kell szerepelnie blank: nem lehet üres products_no_permission: nincs engedélye a vállalkozás termékeinek kezelésére inventory_no_permission: nincs engedélye készlet létrehozására ehhez a termelőhöz none_saved: egyetlen terméket sem mentett sikeresen line_number: "%{number}. sor:" - encoding_error: "Kérjük, ellenőrizze a forrásfájl nyelvi beállítását, és győződjön meg arról, hogy UTF-8 kódolással mentette" + encoding_error: "Kérjük, ellenőrizd a forrásfájl nyelvi beállítását, és győződj meg arról, hogy UTF-8 kódolással mentette" unexpected_error: "A termékimportálás váratlan hibát észlelt a fájl megnyitásakor: %{error_message}" malformed_csv: "A termékimportálás hibás formátumú CSV-fájlt észlelt: %{error_message}" index: @@ -766,6 +866,7 @@ hu: shipping_categories: Szállítási módok dfc_import_form: enterprise: "Vállalkozás" + catalog_url: "DFC katalógus URL" import: "Importálás" import: review: Felülvizsgálat @@ -776,23 +877,23 @@ hu: no_valid_entries: Nem található érvényes bejegyzés none_to_save: Nincsenek menthető bejegyzések some_invalid_entries: Az importált fájl érvénytelen bejegyzéseket tartalmaz - fix_before_import: Kérjük, javítsa ki ezeket a hibákat, és próbálja újra importálni a fájlt - save_valid?: Egyelőre menti az érvényes bejegyzéseket, és elveti a többit? + fix_before_import: Kérjük, javítsd ki ezeket a hibákat, és próbáld újra importálni a fájlt + save_valid?: Mented az érvényes bejegyzéseket, és elveted a többit? no_errors: Nem észleltek hibát! - save_all_imported?: Menti az összes importált terméket? + save_all_imported?: Mented az összes importált terméket? options_and_defaults: Beállítások és alapértelmezett beállítások importálása no_permission: nincs engedélye ennek a vállalkozásnak a kezelésére not_found: vállalkozás nem található az adatbázisban no_name: Névtelen blank_enterprise: egyes termékekhez nincs definiálva a vállalkozás reset_absent?: Hiányzó termékek visszaállítása - reset_absent_tip: Állítsa a készletet nullára minden olyan olyan terméknél, amely nem szerepel a fájlban + reset_absent_tip: Állítsd a készletet nullára minden olyan olyan terméknél, amely nem szerepel a fájlban overwrite_all: Az összes felülírása overwrite_empty: Ha üres, írja felül - default_stock: Állítsa be a készletszintet + default_stock: Állítsd be a készletet default_tax_cat: Adókategória beállítása default_shipping_cat: Szállítási mód beállítása - default_available_date: Állítsa be az elérhető dátumot + default_available_date: Állítsd be az elérhetőségi dátumot validation_overview: Az importálás ellenőrzésének áttekintése entries_found: Bejegyzések találhatók az importált fájlban entries_with_errors: Az elemek hibákat tartalmaznak, és nem importálhatók @@ -805,7 +906,7 @@ hu: line: Vonal item_line: Tételsor import_review: - not_updatable_tip: "következő mezők nem frissíthetők tömeges importálással meglévő termékek esetén:" + not_updatable_tip: "A következő mezők nem frissíthetők tömeges importálással meglévő termékek esetén:" fields_ignored: Ezeket a mezőket a rendszer figyelmen kívül hagyja az importált termékek mentésekor. entries_table: not_updatable: Ez a mező nem frissíthető tömeges importálással meglévő termékeken @@ -846,49 +947,49 @@ hu: title: Leltár description: Ezen az oldalon kezelheted vállalkozásod készleteit. Az itt beállított termékadatok felülírják a „Termékek” oldalon megadottakat enable_reset?: Engedélyezi a készlet visszaállítását? - default_stock: "Alapértelmezett részvény" + default_stock: "Alapértelmezett készlet" inherit?: Örököl? add: Hozzáadás hide: Elrejt import_date: Importált select_a_shop: Válaszd az A árusítóhely lehetőséget - review_now: Tekintse át most + review_now: Tekintsd át most new_products_alert_message: '%{new_product_count} új termék áll rendelkezésre, amelyet hozzáadhat készletéhez.' - currently_empty: A készlet jelenleg üres - no_matching_products: Nem található megfelelő termék a készletében - no_hidden_products: Egyetlen termék sincs elrejtve ebből a készletből + currently_empty: A leltár jelenleg üres + no_matching_products: Nem található megfelelő termék a leltárban + no_hidden_products: Egyetlen termék sincs elrejtve ebből a leltárból no_matching_hidden_products: Egyetlen rejtett termék sem felel meg a keresési feltételeknek no_new_products: Nincsenek új termékek, amelyeket hozzáadhatnának ehhez a készlethez no_matching_new_products: Egyetlen új termék sem felel meg a keresési feltételeknek - inventory_powertip: Ez az Ön termékkészlete. Termékek hozzáadásához a készlethez, a Megtekintés legördülő menüből válaszd az „Új termékek” lehetőséget. + inventory_powertip: Ez az Ön termékkészlete. Termékek hozzáadásához a készlethez, a Megtekintés legördülő menüből válaszd az „Új termék” lehetőséget. hidden_powertip: Ezeket a termékeket elrejtette a készletéből, és nem lesz elérhető az oldalon. A "Hozzáadás" gombra kattintva hozzáadhat egy terméket a készletéhez. - new_powertip: Ezeket a termékeket felveheti a készletébe. Kattintson a "Hozzáadás" gombra egy termék hozzáadásához a készlethez", vagy az „Elrejtés” lehetőséget választva elrejtheti a látás elől. Később bármikor meggondolhatod magad! + new_powertip: Ezeket a termékeket hozzáadhatja a készletéhez. Kattintson a 'Hozzáadás' gombra, ha hozzá szeretne adni egy terméket a készletéhez, vagy a 'Elrejtés' gombra, ha el szeretné rejteni a terméket. Később bármikor meggondolhatja magát! controls: back_to_my_inventory: Vissza a leltárhoz orders: edit: order_sure_want_to: Biztosan %{event} akarja ezt a megrendelést? invoice_email_sent: 'Számla e-mail elküldve' - order_email_resent: 'megrendelés e-mailje újra el lett küldve' + order_email_resent: 'A megrendelési e-mail újra el lett küldve' bulk_management: - tip: "Ezen az oldalon módosíthatja a termékek mennyiségét több rendelés esetén. Szükség esetén a termékek teljes egészében eltávolíthatók a megrendelésekből." + tip: "Ezen az oldalon módosíthatod a termékek mennyiségét több rendelés esetén. Szükség esetén a termékek teljes egészében eltávolíthatók a megrendelésekből." shared: "Megosztott erőforrás?" - order_no: "Rendelési szám." + order_no: "Rendelési szám" order_date: "Elkészült:" max: "Max" product_unit: "Termék: Egység" weight_volume: "Súly/térfogat (kg)" - ask: "Kérdez?" + ask: "Kérdés?" page_title: "Tömeges megrendelés kezelése" actions_delete: "Kiválasztottak törlése" loading: "Megrendelések betöltése" no_results: "Nem található megrendelés." - group_buy_unit_size: "Csoportos vásárlási mértékegység" + group_buy_unit_size: "Csoportos vásárlási egység mérete" total_qtt_ordered: "Teljes rendelt mennyiség" max_qtt_ordered: "Maximális rendelt mennyiség" current_fulfilled_units: "Jelenleg teljesített egységek" max_fulfilled_units: "Maximális teljesített egységek" - order_error: "A rendelések frissítése előtt bizonyos hibákat meg kell oldani.nMinden piros szegélyű mező hibát tartalmaz." + order_error: "A rendelések frissítése előtt bizonyos hibákat meg kell oldani.\nMinden piros szegélyű mező hibát tartalmaz." variants_without_unit_value: "FIGYELMEZTETÉS: Egyes változatok nem rendelkeznek egységértékkel" all: "Minden" select_variant: "Válasszon egy változatot" @@ -903,19 +1004,20 @@ hu: new_enterprise: Új vállalkozás producer?: "Termelő?" package: Csomag - status: Állapot - manage: 'Beállítások:' + status: Státusz + manage: Beállítások form: about_us: legend: "Rólunk" desc_short: Rövid leírás desc_short_placeholder: Meséljen egy-két mondatban vállalkozásáról desc_long: Rólunk - desc_long_placeholder: Mesélj magadról az ügyfeleknek. Ez az információ az Ön nyilvános profilodban jelenik meg. + desc_long_placeholder: Mesélj magadról az ügyfeleknek. Ez az információ a nyilvános profilodon jelenik meg. address: legend: "Cím" business_details: legend: "Vállalkozás adatai" + upload: 'feltöltés' abn: LÉGI ÚTON SZÁLLÍTOTT abn_placeholder: például. 99 123 456 789 acn: Adószám @@ -935,22 +1037,22 @@ hu: business_address: company_legal_name: A cég hivatalos neve company_placeholder: Példa Inc. - address1: Legális cím + address1: Hivatalos cím address1_placeholder: 123 High St. address2: Cím (folyt.) - legal_phone_number: Jogi telefonszám + legal_phone_number: Hivatalos telefonszám phone_placeholder: "98 123 4565" select_country: "Válassz országot" - select_state: "Válaszd az Állam lehetőséget" + select_state: "Válassz államot" contact: legend: "Kapcsolat" name: Név - name_placeholder: például. Gustav Plum + name_placeholder: pl. Példa János email_address: Nyilvános e-mail cím - email_address_placeholder: például. inquiries@fresh-food.com + email_address_placeholder: például kapcsolat@frisszoldseg.hu email_address_tip: "Ez az e-mail cím megjelenik nyilvános profilodban" phone: Telefon - phone_placeholder: például. 98 7654 3210 + phone_placeholder: például 98 7654 3210 whatsapp_phone: WhatsApp telefonszám whatsapp_phone_placeholder: pl. +36-20-123-45-67 whatsapp_phone_tip: "A telefonszám a nyilvános profilodban látszódni fog mint WhatsApp link." @@ -969,6 +1071,7 @@ hu: images: legend: "Képek" logo: Logó + logo_size: "300 x 300 pixel" promo_image_placeholder: 'Ez a kép a "Rólunk" részben látható.' promo_image_note1: 'FIGYELEM:''' promo_image_note2: Minden ide feltöltött promóciós kép 1200 x 260-ra lesz levágva. @@ -986,7 +1089,7 @@ hu: preferred_product_selection_from_inventory_only_yes: Új termékek kerülhetnek a kirakatomba (ajánlott) preferred_product_selection_from_inventory_only_no: Új termékeket kell hozzáadnom a készletemhez, mielőtt a átvételi pontomba kerülhetnék payment_methods: - legend: "fizetési módok" + legend: "Fizetési módok" name: Név applies: Érvényes? manage: Fizetési módok kezelése @@ -998,10 +1101,10 @@ hu: name: Név name_placeholder: például. Plum professzor biodinamikus szarvasgombája groups: Csoportok - groups_tip: Válaszd ki azokat a csoportokat vagy régiókat, amelyeknek tagja. Ez segít az ügyfeleknek megtalálni az Ön vállalkozását. - groups_placeholder: Kezdjen el gépelni az elérhető csoportok kereséséhez... + groups_tip: Válaszd ki azokat a csoportokat vagy régiókat, amelyeknek tagja vagy. Ez segít az ügyfeleknek megtalálni a vállalkozásod + groups_placeholder: Kezdj el gépelni az elérhető csoportok kereséséhez... primary_producer: Termelő? - primary_producer_tip: Termelő vagy, ha termeszted, tenyészted, főzöd, sütöd, erjeszted, stb. a termékeidet. + primary_producer_tip: Válaszd a 'Termelő'-t, ha termeszted, tenyészted, főzöd, sütöd, erjeszted, stb. a termékeidet. producer: Termelő any: Bármi none: Egyik sem @@ -1033,12 +1136,12 @@ hu: shop_preferences: legend: "Átvételi ponti beállítások" shopfront_requires_login: "Nyilvánosan látható kirakat?" - shopfront_requires_login_tip: "Válaszd ki, hogy az ügyfeleknek be kell-e jelentkezniük a kirakat megtekintéséhez, vagy azt mindenki láthatja." + shopfront_requires_login_tip: "Válaszd ki, hogy az ügyfeleknek be kell-e jelentkezniük a profilod megtekintéséhez, vagy azt mindenki láthatja." shopfront_requires_login_false: "Nyilvános" shopfront_requires_login_true: "Csak regisztrált vásárlók számára látható" recommend_require_login: "Javasoljuk, hogy a felhasználók bejelentkezést kérjenek, amikor a rendelés módosítható." allow_guest_orders: "Vendégrendelések" - allow_guest_orders_tip: "Engedélyezze a vendégként való fizetést, vagy kérjen regisztrált felhasználót." + allow_guest_orders_tip: "Engedélyezd a vendégként való fizetést, vagy kérj felhasználói regisztrációt." allow_guest_orders_false: "A megrendeléshez bejelentkezés szükséges" allow_guest_orders_true: "Vendég fizetés engedélyezése" allow_order_changes: "Megrendelések módosítása" @@ -1056,26 +1159,26 @@ hu: shopfront_message: "Kirakatüzenet" shopfront_message_placeholder: > Opcionális üzenet, amely üdvözli az ügyfeleket, és elmagyarázza, hogyan - vásárolhatnak Önnél. Ha itt szöveget ír be, az megjelenik a kezdőlapon, - amikor az ügyfelek először érkeznek az áruító oldalára. - shopfront_message_link_tooltip: "Hivatkozás beszúrása/szerkesztése" + vásárolhatnak Nálad. Ha itt szöveget írsz be, az megjelenik a kezdőlapon, + amikor az ügyfelek először érkeznek az oldaladra. + shopfront_message_link_tooltip: "Hivatkozás beszúrása / szerkesztése" shopfront_message_link_prompt: "Kérjük, adjon meg egy URL-t a beszúráshoz" shopfront_closed_message: "Kirakat zárt üzenet" shopfront_closed_message_placeholder: > - Üzenet a vásárlóknak az árusító oldalán, ha nincs aktív rendelési ciklusa - (azaz az üzlet zárva van). Írja le mikor várható a következő rendelési + Üzenet a vásárlóknak az oldaladon, ha épp nincs aktív rendelési ciklus + (azaz az üzlet zárva van). Írd le mikor várható a következő rendelési ciklus. shopfront_category_ordering: "Kirakati kategória rendelése" shopfront_category_ordering_note: "(fentről lefelé)" - open_date: "Megnyitás dátuma" - close_date: "Bezárás dátuma" + open_date: "Nyitás dátuma" + close_date: "Zárás dátuma" display_ordering_in_shopfront: "Rendelés megjelenítése a kirakatban:" shopfront_sort_by_category: "Kategória szerint" shopfront_sort_by_producer: "A termelő által" shopfront_sort_by_category_placeholder: "Kategória" shopfront_sort_by_producer_placeholder: "Termelő" display_remaining_stock: "Mutassa az elérhető készletet az oldalon, ha már kifogyóban van" - display_remaining_stock_tip: "Mutassa, amikor már háromnál kevesebb maradt belőle." + display_remaining_stock_tip: "Tudassa a vásárlókkal, amikor háromnál kevesebb darab van már csak." enabled: "Engedélyezve" disabled: "Tiltva" social: @@ -1085,17 +1188,17 @@ hu: facebook_placeholder: "például. www.facebook.com/PageNameItt" linkedin_placeholder: "például. www.linkedin.com/in/YourNameItt" stripe_connect: - connect_with_stripe: "Csatlakozzon a Stripe-hoz" + connect_with_stripe: "Csatlakozz a Stripe-al" stripe_connect_intro: "Ha hitelkártyás fizetést szeretnél elfogadni, össze kell kapcsolnod Stripe fiókodat az Open Food Network hálózattal. A kezdéshez használd a jobb oldali gombot." stripe_account_connected: "Stripe fiók csatlakoztatva." disconnect: "Fiók leválasztása" confirm_modal: - title: Csatlakozzon a Stripe-hoz + title: Csatlakozz a Stripe-al part1: A Stripe egy fizetésfeldolgozó szolgáltatás, amely lehetővé teszi az OFN oldalai számára, hogy elfogadják az ügyfelek hitelkártyás fizetését. - part2: Ennek a funkciónak a használatához," csatlakoztatnod kell a Stripe-fiókját az OFN-hez. Az alábbi „Elfogadom” gombra kattintva átirányítod Önt a Stripe webhelyére, ahol meglévő Stripe fiókot csatlakoztathatsz, vagy hozz létre egy újat, ha még nem rendelkezel ilyennel. - part3: Ez lehetővé teszi, hogy az Open Food Network elfogadja az ügyfelek hitelkártyás fizetését az Ön nevében. Felhívjuk figyelmét, hogy saját Stripe-fiókot kell fenntartania"," fizesse ki a Stripe által felszámított díjakat, és maga kezelje a visszaterheléseket és az ügyfélszolgálatot. + part2: Ennek a funkciónak a használatához, csatlakoztatnod kell a Stripe-fiókod az OFN-hez. Az alábbi „Elfogadom” gombra kattintva átirányítunk téged a Stripe webhelyére, ahol meglévő Stripe fiókot csatlakoztathatsz, vagy hozz létre egy újat, ha még nem rendelkezel ilyennel. + part3: Ez lehetővé teszi, hogy az Open Food Network elfogadja az ügyfelek hitelkártyás fizetését a nevedben. Felhívjuk figyelmed, hogy ehhez a funkcióhoz saját Stripe-fiókot kell fenntartanod, a Stripe által felszámított díjakat magadnak kell fizetned, és te kezeled a visszatérítéseket és az ügyfelek kéréseit is. i_agree: Egyetértek - cancel: Vissza + cancel: Törlés tag_rules: legend: "Címkeszabályok" default_rules: @@ -1122,7 +1225,7 @@ hu: managers: Menedzserek managers_tip: A többi felhasználó, aki jogosult a vállalkozás kezelésére. invite_manager: "Menedzser meghívása" - invite_manager_tip: "Hívjon meg egy nem regisztrált felhasználót, hogy regisztráljon, és legyen a vállalkozás vezetője." + invite_manager_tip: "Hívj meg egy nem regisztrált felhasználót, hogy regisztráljon, és legyen a tagja az Open Food Network hálózatának." add_unregistered_user: "Nem regisztrált felhasználó hozzáadása" email_confirmed: "E-mail megerősítve" email_not_confirmed: "Az e-mail cím nincs megerősítve" @@ -1130,12 +1233,29 @@ hu: rate: Mérték customers: Vevő active: Aktív? + add_new: Új hozzáadása + white_label: + remove_logo: "Logo eltávolítása" + remove_logo_confirm: "Biztos vagy benne, hogy eltávolítod ezt a logo-t?" + remove_logo_success: "Logo eltávolítva" + white_label_logo_link_label: "A főoldalon használt logo linkje" connected_apps: + enable: "Adatmegosztás engedélyezése" + disable: "Megosztás leállítása" loading: "Betöltés" + link_label: "Listázás kezelése" + description_html: | +

+ Termelők bemutathatják bio gazdálkodási tanúsítványukat, egyéb gazdálkodási gyakorlatukat és tevékenységeiket a profiljukban. Ez egyszerűsíti a fogyasztók számára, hogy megtalálják a fenntartható gyakorlatokkal előállított termékeket, és kapcsolatba lépjenek a termelőkkel.

+

+ Tudj meg többet a Regeneratív gyakorlatokról. + +

actions: edit_profile: Beállítások properties: Tulajdonságok - payment_methods: fizetési módok + payment_methods: Fizetési módok payment_methods_tip: Ennek a vállalkozásnak nincs fizetési módja shipping_methods: Szállítási módok shipping_methods_tip: Ennek a vállalkozásnak vannak szállítási módjai @@ -1158,10 +1278,10 @@ hu: producer_shop_description_text2: A Termelői átvételi pont kizárólag a saját termékeid értékesítésére szolgál. Ha más termékeit szeretnéd értékesíteni, válaszd a „Termelő Átvételi pont” lehetőséget. producer_hub: Termelő Átvételi pont producer_hub_text: Saját és mások termékeinek értékesítése - producer_hub_description_text: Termelői átvételi pontként értékesítheted saját termékeidet, valamint más vállalkozásoktól átvett termékeket is az Open Food Network oldalán. + producer_hub_description_text: 'Az Open Food Network gerincét az átvételi pontok adják. Amennyiben termelő vagy, átvételi pontként értékesítheted saját termékeidet, de más termelőktől, vállalkozásoktól átvett termékeket is. ' profile: Csak profil get_listing: Szerezzen listát - profile_description_text: Az emberek megtalálhatják és kapcsolatba léphetnek Önnel az Open Food Network-en. Vállalkozása látható lesz a térképen, és kereshető lesz a listákban. + profile_description_text: Az Open Food Network-ön keresztül megtalálnak a fogyasztók és kapcsolatba is léphetnek veled. Vállalkozásod látható lesz a térképen, és kereshető lesz a listákban. hub_shop: Átvételi pont árusítóhely hub_shop_text: Adj el másoktól származó termékeket hub_shop_description_text: Termelői átvételi pontként értékesítheted saját termékeidet, valamint más vállalkozásoktól átvett termékeket is az Open Food Network oldalán. @@ -1175,7 +1295,7 @@ hu: manage_link: Beállítások producer?: "Termelő?" package: "Csomag" - status: "Állapot" + status: "Státusz" new_form: owner: Tulajdonos owner_tip: A vállalkozásért felelős elsődleges felhasználó. @@ -1188,7 +1308,7 @@ hu: title: Új Vállalkozás back_link: Vissza a vállalkozások listájához welcome: - welcome_title: Üdvözöljük az Open Food Networkben! + welcome_title: Üdvözölünk az Open Food Network-ben! welcome_text: Sikeresen létrehozta a next_step: Következő lépés choose_starting_point: 'Válaszd ki csomagját:''' @@ -1203,21 +1323,21 @@ hu: loading: BETÖLTÉS... new: create: "Létrehozás" - cancel: "Megszüntet" + cancel: "Törlés" back_to_list: "Vissza a listához" create: - success: 'Rendelési ciklusa létrejött.''' + success: 'Rendelési ciklusa létrejött.' update: - success: 'Megrendelési ciklusa frissült.''' + success: 'Megrendelési ciklusa frissült.' clone: - success: "Rendelési ciklusát %{name} klónozták." + success: "Rendelési ciklusát %{name} klónozásra került." notify_producers: success: 'A termelőknek küldendő e-mailek sorba kerültek küldés céljából.' edit: save: "Mentés" save_and_next: "Mentés és Tovább" next: "Következő" - cancel: "Megszüntet" + cancel: "Törlés" back_to_list: "Vissza a listához" save_and_back_to_list: "Mentés és Vissza a listához" choose_products_from: "Válasszon termékeket a következők közül:" @@ -1232,24 +1352,24 @@ hu: save: "Mentés" save_and_next: "Mentés és Tovább" next: "Következő" - cancel: "Vissza" + cancel: "Törlés" back_to_list: "Vissza a listához" outgoing: outgoing: "Kimenő" distributor: "Elosztó" products: "Termékek" tags: "Címkék" - delivery_details: "szállítás részletei" + delivery_details: "Szállítás részletei" fees: "Díjak" next: "Következő" previous: "Előző" save: "Mentés" save_and_next: "Mentés és Tovább" - cancel: "Vissza" + cancel: "Törlés" back_to_list: "Vissza a listához" checkout_options: back_end: "Csak back office" - cancel: "Vissza" + cancel: "Törlés" checkout_options: "Fizetési lehetőségek" distributor: "Elosztó" no_payment_methods: Ebben a rendelési ciklusban minden forgalmazónak szüksége van legalább egy fizetési módra. @@ -1334,7 +1454,7 @@ hu: no_data: Hm, valami elromlott. Nem található rendelési ciklus adat. date_warning: msg: Ez a rendelési ciklus %{n} nyitott előfizetéses megrendeléshez kapcsolódik. A dátum módosítása nem érinti a már leadott rendeléseket, de lehetőség szerint kerülni kell. Biztosan folytatja? - cancel: Vissza + cancel: Törlés proceed: Folytassa status: undated: keltezetlen @@ -1429,7 +1549,7 @@ hu: name: Termékek és készlet users_and_enterprises: name: Felhasználók és Vállalkozások - description: Vállalkozási tulajdonjog és állapot + description: Vállalkozási tulajdonjog és státusz order_cycle_management: name: Rendelési ciklus kezelése sales_tax: @@ -1472,6 +1592,9 @@ hu: formatted_data: Formázott adatok packing: name: "Összekészítési jelentések" + oidc_settings: + index: + title: "OIDC Beállítások" subscriptions: index: title: "Előfizetések" @@ -1538,7 +1661,7 @@ hu: no_open_or_upcoming_order_cycle: "Nincs közelgő rendelési ciklus" products_panel: save: "MENTÉS" - saving: "MEGTAKARÍTÁS" + saving: "MENTÉS" saved: "MENTETT" product_already_in_order: Ez a termék már felkerült a rendelésre. Kérjük, módosítsa közvetlenül a mennyiséget. stock: @@ -1597,9 +1720,9 @@ hu: failed_to_update: "Nem sikerült frissíteni a rendelést" checkout: failed: "A fizetés nem sikerült. Kérjük, jelezze felénk, hogy feldolgozhassuk megrendelését." - payment_cancelled_due_to_stock: "Fizetés törölve: a pénztár készlethiba miatt nem fejezhető be." + payment_cancelled_due_to_stock: "Fizetés törölve: a fizetés készlethiba miatt nem fejezhető be." order_not_loaded: "Nem található érvényes rendelés a fizetés feldolgozásához" - your_details_without_number: Személyes adatok + your_details_without_number: Az adataid payment_method_without_number: Fizetési mód order_summary_without_number: Megrendelés-összesítő already_ordered: @@ -1607,6 +1730,7 @@ hu: message_html: "Már van rendelése ehhez a rendelési ciklushoz. Tekintse meg a %{kosarat}, hogy megtekinthesse a korábban megrendelt tételeket. A tételeket törölheti is, amíg a rendelési ciklus nyitva van." step1: contact_information: + title: Kapcsolat email: label: Email phone: @@ -1642,7 +1766,7 @@ hu: label: Kártyaszám placeholder: pl. 4242 4242 4242 4242 card_verification_value: - label: CVC + label: CVC kód card_month: label: Hónap card_year: @@ -1652,18 +1776,21 @@ hu: use_new_card: Adja meg kártyaazonosítóit save_card: Mentse el a kártyát későbbi használatra create_new_card: vagy adja meg alább az új kártyaadatokat - explaination: Megrendelését a következő lépésben tekintheti át és erősítheti meg, amely tartalmazza a végső költségeket. + explaination: A következő lépésben megtekintheted és megerősítheted megrendelésedet, amely tartalmazza a várható költségeket. Amennyiben "valtozoar" jelölésű terméket rendeltél, a végösszeg a pontos súly függvényében változhat. submit: Következő - Megrendelés összegzése - cancel: Vissza az Ön adataihoz + cancel: Vissza az adataidhoz step3: delivery_details: title: Szállítás részletei edit: Szerkesztés address: Szállítási cím + instructions: Megjegyzések payment_method: title: Fizetési mód edit: Szerkesztés + instructions: Megjegyzések order: + title: A megrendelés részletei edit: Szerkesztés terms_and_conditions: message_html: "Elfogadom az eladó %{terms_and_conditions_link} feltételeit." @@ -1673,17 +1800,17 @@ hu: all_terms_and_conditions: message_html: "Elfogadom az eladó %{terms_and_conditions_link} és a platform %{tos_link} feltételeit." terms_and_conditions: "Felhasználási feltételek" - submit: Teljes rendelés + submit: Rendelés elküldése cancel: Vissza a Fizetési módhoz errors: - saving_failed: "A mentés nem sikerült, kérjük, frissítse a kiemelt mezőket." + saving_failed: "A mentés nem sikerült, kérjük, frissítsd a kiemelt mezőket." terms_not_accepted: Kérjük, fogadja el az Általános Szerződési Feltételeket required: A mező nem lehet üres invalid_number: "Adjon meg egy érvényes telefonszámot" invalid_email: "Kérjük valós e-mail címet adjon meg" - select_a_shipping_method: Válasszon szállítási módot + select_a_shipping_method: Válassz szállítási módot! select_a_payment_method: Válassz fizetési módot - no_shipping_methods_available: Szállítási lehetőségek hiánya miatt a fizetés nem lehetséges. Kérjük, lépjen kapcsolatba az üzlet tulajdonosával. + no_shipping_methods_available: Átvételi és szállítási lehetőségek hiánya miatt a fizetés nem lehetséges. Kérjük, lépjen kapcsolatba az üzlet tulajdonosával. voucher_not_found: Nem található shops: hubs: @@ -1714,13 +1841,13 @@ hu: selling_on_ofn: "Érdekel az Open Food Network?" register: "Itt regisztrálj" footer: - footer_secure: "Biztonságos és megbízható." - footer_secure_text: "Az Open Food Network mindenhol SSL-titkosítást (2048 bites RSA) használ, hogy vásárlási és fizetési adatait bizalmasan kezelje. Szervereink nem tárolják hitelkártyaadatait, és a fizetéseket PCI-kompatibilis szolgáltatások dolgozzák fel." + footer_secure: "Biztonságos és felelős adatkezelés." + footer_secure_text: "Az Open Food Network mindenhol SSL-titkosítást (2048 bites RSA) használ, hogy vásárlási és fizetési adataidat bizalmasan kezelje. Szervereink nem tárolják hitelkártya adataidat, és a fizetéseket PCI-kompatibilis szolgáltatások dolgozzák fel." footer_contact_headline: "Kapcsolat" footer_contact_email: "Küldj egy emailt nekünk" footer_nav_headline: "Navigáció" footer_join_headline: "Csatlakozz hozzánk" - footer_join_body: "Hozz létre egy listát, üzletet vagy csoportkönyvtárat az Open Food Networkön." + footer_join_body: "Hozz létre egy termelői profilt, élelmiszerközösséget, vagy fogyasztói csoportot az Open Food Network oldalán." footer_join_cta: "Tovább olvasok!" footer_legal_call: "Olvasd el a mi" footer_legal_visit: "Elérhetőségünk" @@ -1757,6 +1884,7 @@ hu: invoice_column_price_without_taxes: "Teljes ár (adó nélkül)" invoice_column_tax_rate: "Adókulcs" invoice_tax_total: "GST összesen:" + invoice_cancel_and_replace_invoice: "érvényteleníti és cseréli a számlát" tax_invoice: "ADÓSZÁMLA" tax_total: "Teljes adó (%{rate}):" invoice_shipping_category_delivery: "Szállítás" @@ -1766,6 +1894,7 @@ hu: abn: "LÉGI ÚTON SZÁLLÍTOTT:" acn: "Adószám:" invoice_issued_on: "Kiállított számla:" + order_number: "Rendelés sorszáma:" date_of_transaction: "A tranzakció dátuma:" menu_1_title: "Átadópontok" menu_1_url: "/shops" @@ -1776,7 +1905,7 @@ hu: menu_4_title: "Csoportok" menu_4_url: "/groups" menu_5_title: "Rólunk" - menu_5_url: "https://about.openfoodnetwork.org.au/" + menu_5_url: "https://pecsikosar.hu/iranytu/" menu_6_title: "Csatlakozás" menu_6_url: "https://openfoodnetwork.org/au/connect/" menu_7_title: "Tanul" @@ -1848,7 +1977,6 @@ hu: label_account: "fiók" label_more: "Mutass többet" label_less: "Mutass kevesebbet" - label_notices: "Megjegyzések" cart_items: "tételeket" cart_headline: "Kosár" total: "Összesen" @@ -1896,7 +2024,7 @@ hu: cookie_matomo_heatmap_desc: "Matomo Heatmap & Session Recording cookie." cookie_matomo_ignore_desc: "A cookie-k segítségével kizárják a felhasználót a nyomon követésből." disabling_cookies_header: "Figyelmeztetés a cookie-k letiltására" - disabling_cookies_desc: "Felhasználóként bármikor engedélyezheti, blokkolhatja vagy törölheti az Open Food Network vagy bármely más webhely cookie-jait, amikor csak akarja, a böngésző beállítási vezérlőjén keresztül. Minden böngészőnek más operátora van. Itt vannak a linkek:" + disabling_cookies_desc: "Felhasználóként bármikor engedélyezheted, blokkolhatod vagy törölheted az Open Food Network vagy bármely más webhely cookie-jait a böngésző beállításaiban. Minden böngészőnek más a működése. Itt vannak a linkek:" disabling_cookies_firefox_link: "https://support.mozilla.org/en-US/kb/enable-and-disable-cookies-website-preferences" disabling_cookies_chrome_link: "https://support.google.com/chrome/answer/95647" disabling_cookies_ie_link: "https://support.microsoft.com/en-us/help/17442/windows-internet-explorer-delete-manage-cookies" @@ -1910,24 +2038,24 @@ hu: cookies_policy_link: "cookie-kra vonatkozó szabályzat" cookies_accept_button: "Cookie-k elfogadása" home_shop: Tovább a termelőkhöz, átvételi pontokhoz. - brandstory_headline: "Helyi, biztonságos élelmiszer." - brandstory_intro: "Szolidáris élelmiszerrendszert építünk." - brandstory_part1: "Az alapoktól kezdjük. A gazdálkodókkal és termelőkkel, akik készen állnak arra, hogy büszkén és őszintén elmondják történeteiket. A forgalmazókkal, akik készen állnak arra, hogy tisztességesen és becsületesen összekapcsolják az embereket a termékekkel. Azokkal a vásárlókkal, akik hisznek abban, hogy a jobb heti vásárlási döntések komolyan megváltoztathatják a világot." - brandstory_part2: "Akkor szükségünk van egy módra, hogy valósággá tegyük. Egy módja annak, hogy mindenkit megerősítsen, aki élelmiszert termeszt, ad el és vásárol. Egy módja annak, hogy elmeséljük az összes történetet, kezeljük az összes logisztikát. Egy módja annak, hogy a tranzakciót minden nap átalakulássá alakítsa." - brandstory_part3: "Ezért olyan online piacteret építünk, amely kiegyenlíti a versenyfeltételeket. Átlátszó, így valódi kapcsolatokat hoz létre. Nyílt forráskódú, tehát mindenki tulajdonában van. Régiókra és nemzetekre skálázódik, így az emberek világszerte elindítják a verziókat." - brandstory_part4: "Mindenhol működik. Mindent megváltoztat." - brandstory_part5_strong: "Nyílt élelmiszerhálózatnak hívjuk." - brandstory_part6: "Mindannyian szeretjük az ételt. Most már az élelmezési rendszerünket is szerethetjük." + brandstory_headline: "Együtt, az élelem önrendelkezésért!" + brandstory_intro: "Közösség által irányított élelmiszerrendszert építünk." + brandstory_part1: "Az alapoktól kezdjük. A gazdálkodókkal, akiknek fontos, hogy közösen, egy fenntartható és mindenki számára átlátható, hazai élelemrendszert hozzunk létre. \nA bevásárlóközösségekkel, fogyasztói csoportokkal, forgalmazókkal, akik összekapcsolják az embereket a termelőkkel és a termékekkel, és biztosítani szeretnék, hogy a termelők tisztességes díjazásban részesüljenek. \nAzokkal a fogyasztókkal, akik hisznek abban, hogy döntéseiknek hatása van." + brandstory_part2: "Ahhoz, hogy ezt valósággá tegyük, szükségünk van egy eszközre, ami minden résztvevőt megerősít, aki élelmiszert termeszt, ad el, szervez, tervez, fogyaszt. \nEgy eszközre, amely láthatóvá teszi a gazdákat, a közösségeket, a termesztési módszereket, és képes kezelni a logisztikát. \nEz az Open Food Network platformja, amely országonként saját közösségi irányítás alatt áll, ugyanakkor globális erőforrásainkat összeadva fejlesztjük." + brandstory_part3: "Egy olyan piacteret hozunk így létre, amely átlátható, közvetlen kapcsolatokon alapul, láthatóvá teszi a rövid ellátási lánc szemeit.\nKifejezetten az élelmiszerek értékesítésére készült, így képes kezelni a trükkös méréseket vagy készletszinteket, amelyek csak az élelmiszerek esetében fordulnak elő.\nA termelők létrehozhatnak saját profilt, beszedhetik a fizetéseket, a platformon lévő más átadópontokon keresztül is értékesíthetnek, kiszállíthatnak, vagy akár futárszolgálattal is dolgozhatnak.\nA közösségek összefoghatják a helyi termelőket, hogy virtuális termelői piacokat vagy bevásárlóközösségeket hozzanak létre, és ezáltal rugalmas helyi élelmiszer-gazdaságot építsenek" + brandstory_part4: "És ami legalább olyan fontos, mint maga a szoftver, azok az értékek, amelyek a szoftver alapját képezik.\nHa élelmiszert értékesítesz – akár mint gazdálkodó, akár mint termelői piac, vagy termelői szövetkezet vagy élelmiszer-központ -, akkor olyan szoftvert válassz, amely összhangban van az értékeiddel, az emberek és a bolygó érdekével, nem pedig a profit érdekében tevékenykedik. " + brandstory_part5_strong: "Open Food Network – a Szabad Élelmiszerhálózat" + brandstory_part6: "Csatlakozz te is!" system_headline: "A vásárlás lépései" system_step1: "1. Keresés" - system_step1_text: "Böngészhetsz közvetlenül a gazdák, vagy a bevásárlóközösségek kínálatában. Kereshetsz a lakhelyed, a termelő, élelmiszertípus és termesztési mód szerint." + system_step1_text: "Böngészhetsz közvetlenül a gazdák, vagy a bevásárlóközösségek kínálatában. Kereshetsz a lakhelyed, a termelő, élelmiszertípus, és termesztési mód szerint." system_step2: "2. Vásárlás" - system_step2_text: "Pakold meg a bevásárlókosarad helyi termelőktől származó termékekkel. Vásárolj olyan élelmiszert, amelynek ismered az eredetét, és tudod hogyan állították elő." + system_step2_text: "Alakítsd át a fogyasztási szokásaidat! Pakold meg a bevásárlókosarad helyi termelőktől származó termékekkel. Vásárolj olyan élelmiszert, amelynek ismered az eredetét, és tudod, hogyan állították elő." system_step3: "3. Átvétel / kiszállítás" - system_step3_text: "Válaszd a kiszállítást, vagy a személyesebb kapcsolat érdekében, keresd fel a termelőt, vagy az átvételi pontot." - cta_headline: "Bevásárlás, amellyel jobb hellyé teszed a világot." + system_step3_text: "Válaszd a kiszállítást, vagy a személyesebb kapcsolat érdekében keresd fel a termelőt, vagy az átvételi pontot." + cta_headline: "A jövőnk fenntartható élelmiszerhálózata." cta_label: "Tovább a termelőkhöz, átvételi pontokhoz." - stats_headline: "Termelők és vásárlók közösségét építjük." + stats_headline: "Termelők és fogyasztók közösségét építjük." stats_producers: "élelmiszer-termelők" stats_shops: "élelmiszerátvételi pontok" stats_shoppers: "élelmiszervásárlók" @@ -1937,7 +2065,7 @@ hu: checkout_order_ready: Átvételi időpont checkout_hide: Elrejt checkout_expand: Kinyit - checkout_headline: "Rendben, készen áll a fizetésre?" + checkout_headline: "Rendben, készen állsz a fizetésre?" checkout_as_guest: "Rendelés regisztráció nélkül" checkout_details: "Személyes adatok" checkout_billing: "Számlázási információ" @@ -1964,7 +2092,7 @@ hu: order_delivery_on: Kiszállítás order_delivery_address: Szállítási cím order_delivery_time: Szállítási idő - order_special_instructions: "Az Ön megjegyzései:" + order_special_instructions: "Megjegyzés:" order_pickup_time: Átvétel időpontja order_pickup_instructions: Átvételi információk order_produce: Összesen @@ -1974,10 +2102,10 @@ hu: order_includes_tax: (adót tartalmaz) order_payment_paypal_successful: PayPal-on keresztüli fizetését sikeresen feldolgoztuk. order_hub_info: Átvételi pont Info - order_back_to_store: Vissza a átvételi pontba + order_back_to_store: Vissza az átvételi pontba order_back_to_cart: Vissza a kosárba - order_back_to_website: Vissza a Webhelyre - bom_tip: "Ezen az oldalon módosíthatja a termékek mennyiségét több rendelés esetén. Szükség esetén a termékek teljes egészében eltávolíthatók a megrendelésekből." + order_back_to_website: Vissza az Átadó pont oldalára + bom_tip: "Ezen az oldalon módosíthatod a termékek mennyiségét több rendelés esetén. Szükség esetén a termékek teljes egészében eltávolíthatók a megrendelésekből." unsaved_changes_warning: "A nem mentett módosítások léteznek, és ha folytatja, elvesznek." unsaved_changes_error: "A piros szegélyű mezők hibákat tartalmaznak." products: "Termékek" @@ -1991,7 +2119,7 @@ hu: email_confirmation_click_link: "Kérjük, kattintson az alábbi linkre az e-mail-cím megerősítéséhez és a profil beállításának folytatásához." email_confirmation_link_label: "Erősítse meg ezt az e-mail címet »" email_confirmation_help_html: "Az e-mail-cím megerősítése után hozzáférhet a vállalkozás adminisztrációs fiókjához. Tekintse meg a %{link} webhelyet, hogy többet megtudjon %{sitename} szolgáltatásairól, és elkezdhesse használni profilját vagy online áruházát." - email_confirmation_notice_unexpected: "Azért kaptad ezt az üzenetet, mert regisztráltál a(z) %{sitename} webhelyen, vagy egy olyan személy, akit valószínűleg ismersz, meghívta a regisztrációra. Ha nem érti, miért kapta ezt az e-mailt, kérjük, írjon a %{contact} címre." + email_confirmation_notice_unexpected: "Azért kaptad ezt az üzenetet, mert regisztráltál a(z) %{sitename} webhelyen, vagy egy olyan személy, akit valószínűleg ismersz, meghívott. Ha nem érted, miért kaptad ezt az e-mailt, kérjük, írj a %{contact} címre." email_social: "Kapcsolatba lép velünk:" email_contact: "Küldj egy emailt nekünk:" email_signoff: "Egészségére," @@ -2014,6 +2142,7 @@ hu: email_payment_paid: FIZETETT email_payment_not_paid: NEM FIZETETT email_payment_description: Fizetési információk + email_payment_summary: Fizetési összesítő email_payment_method: "Fizetés:" email_so_placement_intro_html: "Új rendelése van a %{distributor}-nál" email_so_placement_details_html: "Megrendelés részletei:" @@ -2039,7 +2168,7 @@ hu: email_shipping_collection_details: Gyűjtemény részletei email_shipping_collection_time: "Átvétel időpontja:" email_shipping_collection_instructions: "Átvételi információk:" - email_special_instructions: "Az Ön megjegyzései:" + email_special_instructions: "Megjegyzés:" email_signup_greeting: Helló! email_signup_welcome: "Üdvözöljük a %{sitename} oldalon!" email_signup_confirmed_email: "Köszönjük, hogy megerősítette e-mailjét." @@ -2051,7 +2180,7 @@ hu: invited_to_manage: "Meghívást kaptál, hogy kezeld a(z) %{enterprise} %{instance} szolgáltatást." confirm_your_email: "Egy megerősítő linket tartalmazó e-mailt kellett volna kapnia, vagy hamarosan kapni fog. Addig nem férhetsz hozzá %{enterprise} profiljához, amíg meg nem erősíted az e-mail címedet." set_a_password: "Ezután a rendszer kéri, hogy állítson be egy jelszót, mielőtt felügyelheti a vállalkozásot." - mistakenly_sent: "Nem tudja, miért kapta ezt az e-mailt? További információért forduljon %{owner_email}-hoz." + mistakenly_sent: "Nem tudod, miért kaptad ezt az e-mailt? További információért fordulj %{owner_email}-hoz." producer_mail_greeting: "kedves" producer_mail_text_before: "Alább megtalálja a rendelési ciklusra vonatkozó frissítést:" producer_mail_order_text: "Íme a termékei megrendelésének összefoglalása:" @@ -2059,7 +2188,7 @@ hu: producer_mail_signoff: "Köszönet és jókívánságok" producer_mail_order_customer_text: "Itt található a rendelések összegzése ügyfelek szerint csoportosítva" shopping_oc_closed: A rendelések lezárva - shopping_oc_closed_description: "Kérjük, várja meg, amíg a következő ciklus megnyílik (vagy lépjen kapcsolatba velünk közvetlenül, hogy tudjuk-e fogadni a késedelmes rendeléseket)" + shopping_oc_closed_description: "Kérjük, várd meg, amíg a következő ciklus megnyílik (vagy lépj kapcsolatba velünk közvetlenül, hogy tudjuk-e fogadni a a ciklus zárása utáni rendeléseket)" shopping_oc_last_closed: "Az utolsó ciklus %{distance_of_time} előtt zárult" shopping_oc_next_open: "A következő ciklus %{distance_of_time} múlva kezdődik" shopping_oc_select: "Válassz..." @@ -2073,7 +2202,7 @@ hu: shopping_contact_web: "Kapcsolat" shopping_contact_social: "Kövesse" shopping_groups_part_of: "része:" - shopping_producers_of_hub: "%{hub}termelői:" + shopping_producers_of_hub: "%{hub} termelői:" enterprises_next_closing: "A következő rendelés lezárása" enterprises_currently_open: "A rendelések jelenleg nyitva vannak" enterprises_ready_for: "Nyitás" @@ -2146,7 +2275,7 @@ hu: groups_contact_email: Küldj egy emailt nekünk groups_contact_website: Látogasd meg weboldalunkat groups_contact_facebook: Kövess minket Facebookon - groups_signup_title: Regisztráljon csoportként + groups_signup_title: Regisztrálj csoportként groups_signup_headline: Csoportok regisztráció groups_signup_intro: "Egyedülálló platform vagyunk az együttműködésen alapuló marketinghez, amely a legegyszerűbb módja annak, hogy tagjai és érdekelt felei új piacokat érjenek el. Mi non-profit, megfizethető és egyszerű szervezet vagyunk." groups_signup_email: Küldj egy emailt nekünk @@ -2176,7 +2305,7 @@ hu: producers_filter_property: Tulajdonság producers_title: Termelők producers_headline: Keress helyi termelőket - producers_signup_title: Regisztráljon termelőként + producers_signup_title: Regisztrálj termelőként producers_signup_headline: Élelmiszer-termelők, felhatalmazott. producers_signup_motivation: Adja el ételeit, és mesélje el történeteit változatos új piacokon. Takarítson meg időt és pénzt minden rezsinél. Kockázat nélkül támogatjuk az innovációt. Kiegyenlítettük a játékteret. producers_signup_send: Csatlakozz most @@ -2196,22 +2325,22 @@ hu: name_or_sku: "NÉV VAGY Cikkszám" register_title: Regisztráció sell_title: "Regisztráció" - sell_headline: "Csatlakozzon az Open Food Network-hez!" - sell_motivation: "Mutasd be gyönyörű ételeidet." + sell_headline: "Legyél Te is a hálózat tagja!" + sell_motivation: "Mutasd be termékeidet, tedd elérhetővé a fogyasztók számára." sell_producers: "Termelők" sell_hubs: "Átvételi pontok" sell_groups: "Csoportok" - sell_producers_detail: "Hozz létre profilt vállalkozásod számára az OFN-en percek alatt. Bármikor frissítheted profilod egy online áruházra, és közvetlenül ajánlhatod termékeidet a vásárlóknak." - sell_hubs_detail: "Hozz létre profilt a vállalkozásod számára az OFN-en. Bármikor frissítheted egy többtermelős átvételi pontra." - sell_groups_detail: "Hozz létre egy személyre szabott cégjegyzéket (termelők és egyéb élelmiszeripari vállalkozások) régiója vagy szervezete számára." - sell_user_guide: "Tudjon meg többet használati útmutatónkban." - sell_listing_price: "A listázás az OFN-en ingyenes. Egy üzlet megnyitása és működtetése az OFN-en ingyenes havi 500 USD-ig. Ha többet ad el, akkor az árbevétel 1%-a és 3%-a között választhatja meg közösségi hozzájárulását. Az árakkal kapcsolatos további részletekért keresse fel a Szoftverplatform részt a felső menü Névjegy linkjén keresztül." - sell_embed: "Ezenkívül beágyazhatunk egy OFN üzletet saját, személyre szabott webhelyébe, vagy személyre szabott helyi élelmiszer-hálózati webhelyet készíthetünk az Ön régiójában." - sell_ask_services: "Kérdezzen minket az OFN szolgáltatásairól." + sell_producers_detail: "Őstermelő, kistermelő, családi gazdálkodó, vagy épp kisválllalkozás vagy? Hozz létre termelői profilt az OFN-en percek alatt. Bármikor frissítheted profilod egy online áruházra, és közvetlenül ajánlhatod termékeidet a fogyasztóknak." + sell_hubs_detail: "Bevásárlóközösséget indítanál? Vagy csak összefognál a termelőtársakkal és közösen szólítanátok meg a fogyasztókat? Hozz létre új profilt, vagy bármikor frissítheted a profilodat egy többtermelős átvételi pontra." + sell_groups_detail: "Hozz létre egy személyre szabott jegyzéket (termelők és egyéb élelmiszeripari vállalkozások) régiója vagy szervezete számára." + sell_user_guide: "Tudj meg többet használati útmutatónkból." + sell_listing_price: "A termelői regisztráció az OFN-en ingyenes, és az is marad. A platformon történő értékesítés volumenétől függően azonban közösségi hozzájárulást kérünk, a szoftver üzemeltetéshez és IT support biztosításához . \nRészletek hamarosan. " + sell_embed: "Ezenkívül beágyazhatunk egy OFN profilt saját, személyre szabott webhelyedbe, vagy személyre szabott helyi élelmiszerközösségi webhelyet készíthetünk számodra." + sell_ask_services: "Kérdezz bátran egyéb szolgáltatásainkról. " shops_title: Átadópontok - shops_headline: Bevásárlás, másképpen. + shops_headline: Bevásárlás újragondolva. shops_text: Rendelési ciklusokban dolgozunk. A növénytermesztés, az állattenyésztés, az élelem előállítása ciklikus folyamat. Így nálunk az áruátadás is ciklusokban történik, pont ahogy a növények is hétről hétre, és eltérő ütemben fejlődnek. Ha lezárt rendelési ciklust találsz valahol, nézd meg, ki van-e írva a rendelési ciklus nyitásának időpontja. Ha nem, látogass vissza később az adott termelőhöz, közösséghez. - shops_signup_title: Regisztráljon átvételi pontként + shops_signup_title: Regisztrálj átvételi pontként shops_signup_headline: Élelmiszer-központok, korlátlan. shops_signup_motivation: Bármi legyen is a modelled, támogatunk téged. Azonban változol, veled vagyunk. Mi non-profit, független," és nyílt forráskódú. Mi vagyunk azok a szoftverpartnerek, akikről álmodott. shops_signup_action: Csatlakozz most @@ -2307,7 +2436,7 @@ hu: november: "november" december: "december" email_not_found: "Az e-mail cím nem található" - email_unconfirmed: "A jelszó visszaállítása előtt meg kell erősítenie e-mail címét." + email_unconfirmed: "A jelszó visszaállítása előtt meg kell erősítened az e-mail címed." email_required: "Meg kell adnia egy e-mail címet" logging_in: "Várjon egy kicsit, bejelentkezünk" signup_email: "Az email címed" @@ -2380,7 +2509,7 @@ hu: question: "Termelő vagy?" yes_producer: "Igen, termelő vagyok" no_producer: "Nem, nem vagyok termelő" - producer_field_error: "Kérem, válasszon egyet. Termelő vagy?" + producer_field_error: "Kérjük, válassz egyet. Termelő vagy?" yes_producer_help: "Akkor vagy termelő, ha termeszted, tenyészted, főzöd, sütöd, erjeszted, stb. a termékeidet." no_producer_help: "Ha nem vagy termelő, akkor valószínűleg olyan valaki vagy, aki élelmiszert ad el, vagy ad át. Lehetsz egy csomópont, szövetkezet, vásárlási csoport, kiskereskedő, nagykereskedő, stb. megbízottja / képviselője." create_profile: "Profil létrehozása" @@ -2476,8 +2605,8 @@ hu: balance: "Egyensúly" transaction: "Tranzakció" transaction_date: "A dátum #Tranzakció csak a :dátummal való ütközés elkerülése érdekében kulcsfontosságú" - payment_state: "Fizetési állapot" - shipping_state: "Szállítási állapot" + payment_state: "Fizetési státusz" + shipping_state: "Szállítási státusz" value: "Mennyiség" balance_due: "Fizetendő összeg" credit: "Hitel" @@ -2529,7 +2658,7 @@ hu: distributor: "Elosztó" enterprise_fees: "Vállalkozási díjak" process_my_order: "Rendelésem feldolgozása" - delivery_instructions: Szállítási útmutató + delivery_instructions: Szállítási utasítások delivery_method: szállítási mód fee_type: "Díjtípus" tax_category: "Adókategória" @@ -2585,7 +2714,7 @@ hu: spree_admin_single_enterprise_alert_mail_confirmation: "Kérjük, erősítse meg az e-mail címet" spree_admin_single_enterprise_alert_mail_sent: "E-mailt küldtünk a címre" spree_admin_overview_action_required: "Cselekvést kíván" - spree_admin_overview_check_your_inbox: "Kérjük, nézze meg beérkezett üzeneteit a további utasításokért. Köszönjük!" + spree_admin_overview_check_your_inbox: "Kérjük, nézd meg beérkezett üzeneteid a további utasításokért. Köszönjük!" spree_admin_unit_value: Egységérték spree_admin_unit_description: Egység leírása spree_admin_variant_unit: Változatos egység @@ -2672,7 +2801,7 @@ hu: report_header_order_cycle: Rendelési ciklus report_header_user: Felhasználó report_header_email: Email - report_header_status: Állapot + report_header_status: Státusz report_header_comments: Hozzászólások report_header_first_name: Keresztnév report_header_last_name: Vezetéknév @@ -2723,9 +2852,10 @@ hu: report_header_total_tax: "Összes adó (%{currency_symbol})" report_header_total_excl_tax: "Összesen, kivéve adó (%{currency_symbol})" report_header_total_incl_tax: "Összesen, beleértve adó (%{currency_symbol})" + report_header_total_orders: "Össz Rendelésszám" report_header_enterprise: Vállalkozás report_header_enterprise_fee_name: Név - report_header_enterprise_fee_type: típus + report_header_enterprise_fee_type: Típus report_header_enterprise_fee_owner: Tulajdonos report_header_customer: Vevő report_header_customer_first_name: Keresztnév @@ -2733,6 +2863,7 @@ hu: report_header_customer_code: Ügyfélkód report_header_product: Termék report_header_product_properties: Termék tulajdonságai + report_header_product_tax_category: Termék Adó kategóriája report_header_quantity: Mennyiség report_header_max_quantity: Max Mennyiség report_header_variant: Változat @@ -2745,6 +2876,7 @@ hu: report_header_supplier: Termelő report_header_producer: Termelő report_header_producer_suburb: Termelő település + report_header_producer_tax_status: Termelő adókategóriája report_header_unit: Mértékegység report_header_group_buy_unit_quantity: Csoportos vásárlási egység mennyisége report_header_cost: Költség @@ -2760,6 +2892,7 @@ hu: report_header_distributor_address: Forgalmazó címe report_header_distributor_city: Forgalmazó város report_header_distributor_postcode: Forgalmazó irányítószáma + report_header_distributor_tax_status: A Forgalmazó Adózási státusza report_header_delivery_address: Szállítási cím report_header_delivery_postcode: Szállítási irányítószám report_header_bulk_unit_size: Tömeges mértékegység @@ -2781,7 +2914,7 @@ hu: report_header_customer_email: Ügyfél e-mail report_header_customer_phone: Ügyfél telefon report_header_customer_city: Ügyfél városa - report_header_payment_state: Fizetési állapot + report_header_payment_state: Fizetési státusz report_header_payment_type: Fizetési mód report_header_item_price: "Tétel (%{currency})" report_header_item_fees_price: "Tétel + díjak (%{currency})" @@ -2817,6 +2950,9 @@ hu: report_header_transaction_fee: Tranzakciós díj (adó nélkül) report_header_total_untaxable_admin: Összes adózhatatlan rendszergazdai korrekció (adó nélkül) report_header_total_taxable_admin: Összes adóköteles rendszergazdai korrekció (adóval együtt) + report_line_cost_of_produce: Termékek költsége + report_line_line_items: tételsor + report_header_last_completed_order_date: Utolsó teljesített rendelés dátuma report_xero_configuration: Xero konfiguráció initial_invoice_number: "Kezdeti számlaszám" invoice_date: "Számla kiállítási dátuma" @@ -2828,7 +2964,7 @@ hu: filter_products: "Termékek szűrése" delete_product_variant: "Az utolsó változat nem törölhető!" progress: "előrehalad" - saving: "Megtakarítás.." + saving: "Mentés..." success: "siker" failure: "kudarc" unsaved_changes_confirmation: "A nem mentett módosítások elvesznek. Mindenképp folytatni?" @@ -2905,14 +3041,18 @@ hu: no_orders_found: "Nem található rendelés" order_information: "Rendelési információ" new_payment: "Új fizetés" + create_or_update_invoice: "Számla Létrehozása vagy Frissítése" date_completed: "Teljesítés dátuma" amount: "Összeg" + invoice_number: "A számla sorszáma" + invoice_file: "File" + invalid_url: "%{url}érvénytelen URL" state_names: ready: Kész pending: Függőben levő - shipped: Kiszállított + shipped: Kiszállítva js: - saving: 'Megtakarítás...''' + saving: 'Mentés...' changes_saved: 'Változtatások elmentve.''' authorising: "Engedélyezés..." save_changes_first: Először mentse a változtatásokat. @@ -2942,9 +3082,10 @@ hu: deleting_item_will_cancel_order: "Ez a művelet egy vagy több üres rendelést eredményez, amelyek törlésre kerülnek. Szeretné folytatni?" modals: got_it: "Megvan" + confirm: "Megerősítés" close: "Bezárás" continue: "Tovább" - cancel: "Vissza" + cancel: "Törlés" invite: "Meghívás" invite_title: "Nem regisztrált felhasználó meghívása" tag_rule_help: @@ -2978,7 +3119,7 @@ hu: panels: save: MENTÉS saved: MENTETT - saving: MEGTAKARÍTÁS + saving: MENTÉS enterprise_package: hub_profile: Átvételi pont profil hub_profile_cost: "KÖLTSÉG: MINDIG INGYENES" @@ -3071,16 +3212,12 @@ hu: is adhatnak át a vásárlóknak az átadóponton. non_producer: Nem termelő non_producer_text1: > - Non-termelős do not produce any food themselves, meaning that they cannot - create: A nem termelők maguk nem állítanak elő élelmiszert, vagyis nem - tudnak létrehozni their own products for sale through the Open Food - Network.: saját termékeiket az Open Food Networkön keresztül értékesítik. + A nem-termelők maguk nem állítanak elő élelmiszert, vagyis nem tudják + feltölteni saját termékeiket, és az Open Food Networkön keresztül értékesíteni. non_producer_text2: > - Instead, non-termelős specialise in linking termelős to the end eater, - whether it: Helyette," nem termelők arra specializálódtak, hogy összekapcsolják - a termelőket a végfogyasztóval", hogy az be by aggregating, grading, - packing, selling or delivering food.: összesítésével legyen, osztályozás, - csomagolás, élelmiszer értékesítése vagy szállítása. + A nem-termelők arra specializálódtak, hogy összekapcsolják a termelőket + a fogyasztóval akár olyan módon, hogy összegyűjtik a rendeléseket, vagy + szortírozzák, csomagolják, szállítják. producer_desc: Élelmiszer termelők producer_example: például. TERMELŐK, PÉKEK, SÖRÖZŐK, KÉSZÍTŐK non_producer_desc: Minden más élelmiszeripari vállalkozás @@ -3096,6 +3233,8 @@ hu: select_all_variants: "Válaszd ki az összes %{total_number_of_variants} változatot" variants_loaded: "%{num_of_variants_loaded}/%{total_number_of_variants} változat betöltve" loading_variants: "Változatok betöltése" + no_variants: "Nincs elérhető termékváltozat ehhez a termékhez (a készletbeállításokban rejtett státuszúak)." + some_variants_hidden: "(Egyes termékváltozatok a leltárbeállítások miatt rejtve maradhatnak)" tag_rules: shipping_method_tagged_top: "Szállítási módok felcímkézve" shipping_method_tagged_bottom: "vannak:" @@ -3138,7 +3277,7 @@ hu: partial: "részleges" pending: "függőben levő" ready: "kész" - shipped: "kiszállított" + shipped: "kiszállítva" canceled: "törölve" payment_states: balance_due: "fizetendő összeg" @@ -3237,7 +3376,7 @@ hu: no_authorisation: "Nem sikerült felhatalmazást kapnom a módosítások mentésére, így azok mentés nélkül maradnak." some_trouble: "Problémáim akadtak a mentésnél: %{errors}" changing_on_hand_stock: Változás a kézi készletszinten... - stock_reset: A részvények visszaállnak az alapértelmezett értékekre. + stock_reset: A készletek visszaállnak az alapértelmezett értékekre. tag_rules: show_hide_variants: 'Változatok megjelenítése vagy elrejtése a kirakatomban' show_hide_shipping: 'Szállítási módok megjelenítése vagy elrejtése fizetéskor' @@ -3263,7 +3402,7 @@ hu: create_failure: "Nem sikerült létrehozni a rendelési ciklust" update_success: 'Megrendelési ciklusa frissült.''' update_failure: "Nem sikerült frissíteni a rendelési ciklust" - no_distributors: Ebben a rendelési ciklusban nincsenek forgalmazók. Ez a rendelési ciklus nem lesz látható az ügyfelek számára, amíg nem ad hozzá egyet. Szeretné folytatni a rendelési ciklus mentését?' + no_distributors: Ebben a rendelési ciklusban nincsenek forgalmazók. Ez a rendelési ciklus nem lesz látható az ügyfelek számára, amíg nem adsz hozzá forgalmazót. Szeretnéd folytatni a rendelési ciklus mentését?' enterprises: producer: "Termelő" non_producer: "Nem termelő" @@ -3278,8 +3417,8 @@ hu: users: order: "Rendelés" registration: - welcome_to_ofn: "Üdvözöljük az Open Food Networkben!" - signup_or_login: "Kezdje regisztrációval (vagy bejelentkezéssel)" + welcome_to_ofn: "Üdvözöljük az Open Food Network-ben!" + signup_or_login: "Kezd a regisztrációval (vagy bejelentkezéssel)" have_an_account: "Már van fiókja?" action_login: "Jelentkezzen be most." stripe_elements: @@ -3441,7 +3580,7 @@ hu: account: "fiók" logout: "Kijelentkezés" date_range: "Időintervallum" - status: "állapot" + status: "státusz" new: "Új" start: "Kezdete" end: "Vége" @@ -3450,6 +3589,7 @@ hu: previous: "Előző" last: "Utolsó" spree: + order_updated: "Rendelés frissült" add_country: "Ország hozzáadása" add_state: "Állapot hozzáadása" adjustment: "Beállítás" @@ -3477,7 +3617,7 @@ hu: new_taxon: "Új taxon" new_user: "Új felhasználó" no_pending_payments: "Nincsenek függőben lévő kifizetések" - remove: "eltávolítás" + remove: "Eltávolítás" none: "Egyik sem" not_found: "Nem található" notice_messages: @@ -3489,9 +3629,12 @@ hu: server_error: "Szerver hiba" shipping_method_names: UPS Ground: "UPS föld" + pick_up: "Átvétel a gazdaságban" start_date: "Kezdő dátum" successfully_removed: "Sikeresen eltávolítva" taxonomy_edit: "Termék kategória szerkesztés" + taxonomy_tree_error: "Hiba lépett fel a Kategória-fa frissítésében." + taxonomy_tree_instruction: "Kattints a jobb gombbal egy elemre a hozzáadáshoz, átnevezéshez, eltávolításhoz vagy szerkesztéshez." tree: "Fa" updating: "Frissítés" your_order_is_empty_add_product: "Rendelése üres, kérjük keressen és adjon hozzá egy terméket fent" @@ -3501,7 +3644,7 @@ hu: back_to_orders_list: "Vissza a rendelési listához" back_to_payments_list: "Vissza a fizetési listához" return_authorizations: "Visszaküldési engedélyek" - cannot_create_returns: "Nem hozható létre visszaküldés, mivel ebben a rendelésben nincsenek kiszállított egységek." + cannot_create_returns: "Nem tudsz visszárut létrehozni, mivel a rendelésnek nincsenek kiszállított egységei." select_stock: "Válasszon részvényt" location: "Elhelyezkedés" count_on_hand: "Count On Hand" @@ -3544,6 +3687,7 @@ hu: credit_card: "Hitelkártya" new_payment: "Új fizetés" capture: "Elfog" + capture_and_complete_order: "A rendelés rögzítése és lezárása" void: "Üres" login: "Belépés" password: "Jelszó" @@ -3570,6 +3714,7 @@ hu: display_currency: "Megjelenítési pénznem" choose_currency: "válasszon pénznemet" mail_method_settings: "Levelezési mód beállításai" + mail_settings_notice_html: "Az itt végrehajtott módosítások csak ideiglenesek, hibakeresés céljából történnek, és a jövőben visszaállíthatók.
A végleges változtatásokat a biztonsági adatok frissítésével és az ofn-install segítségével történő telepítéssel lehet elvégezni. További részletekért forduljon az OFN globális csapatához." general: "Tábornok" enable_mail_delivery: "Levélkézbesítés engedélyezése" send_mails_as: "Levelek küldése másként" @@ -3612,10 +3757,11 @@ hu: shipping_method: "Szállítási Mód" shipment: "Szállítás" payment: "Fizetés" - status: "Állapot" + status: "Státusz" shipping_categories: "Szállítási módok" new_shipping_category: "Új szállítási mód" back_to_shipping_categories: "Vissza a szállítási módokhoz" + editing_shipping_category: "Szállítási kategória szerkesztése" name: "Név" description: "Leírás" type: "típus" @@ -3660,7 +3806,7 @@ hu: cannot_create_payment_without_payment_methods: "Fizetési módok megadása nélkül nem hozhat létre fizetést egy rendelésre." please_define_payment_methods: "Kérjük, először határozzon meg néhány fizetési módot." options: "Opciók" - has_no_shipped_units: "nincs szállított egysége" + has_no_shipped_units: "nincsenek kiszállított egységek" successfully_created: '%{resource} sikeresen létrehozva!' successfully_updated: '%{resource} sikeresen frissítve!' payment_method: "Fizetési mód" @@ -3672,7 +3818,7 @@ hu: out_of_stock: '%{item} elfogyott.' actions: update: "Frissítés" - cancel: "Vissza" + cancel: "Törlés" shared: error_messages: errors_prohibited_this_record_from_being_saved: @@ -3685,7 +3831,7 @@ hu: date_time: "Dátum idő" amount: "Összeg" payment_method: "Fizetési mód" - payment_state: "Fizetési állapot" + payment_state: "Fizetési Státusz" errors: messages: included_price_validation: "nem választható ki, hacsak nem állított be egy alapértelmezett adózónát" @@ -3698,6 +3844,11 @@ hu: validation: must_be_int: "egész számnak kell lennie" admin: + images: + edit: + title: Termékkép szerkesztése + close: Vissza + upload: Fotó feltöltése mail_methods: send_testmail: "Küldj teszt e-mailt" testmail: @@ -3724,6 +3875,11 @@ hu: enterprise_relationships: "Engedélyek" customers: "Ügyfelek" groups: "Csoportok" + oidc_settings: "OIDC Beállítások" + overview: "Áttekintés" + product_import: "Importálás" + enterprise_roles: "Szerepek" + payment_methods: "Fizetési módok" product_properties: index: inherits_properties_checkbox_hint: "Tulajdonságokat örököl a következőtől: %{supplier}? (hacsak nincs felülírva)" @@ -3748,9 +3904,9 @@ hu: return_authorizations: "Visszaküldési engedélyek" back_to_orders_list: "Vissza a rendelési listához" rma_number: "RMA szám" - status: "Állapot" + status: "Státusz" amount: "Összeg" - cannot_create_returns: "Nem hozható létre visszaküldés, mivel ebben a rendelésben nincsenek kiszállított egységek." + cannot_create_returns: "Nem tudsz visszárut létrehozni, mivel a rendelésnek nincsenek kiszállított egységei." continue: "Tovább" new: new_return_authorization: "Új visszaküldési engedély" @@ -3762,7 +3918,7 @@ hu: return_authorization: "Visszaküldési engedély" form: product: "Termék" - quantity_shipped: "Szállított mennyiség" + quantity_shipped: "Kiszállított mennyiség" quantity_returned: "Visszaadott mennyiség" return_quantity: "Visszaküldési mennyiség" amount: "Összeg" @@ -3781,6 +3937,9 @@ hu: add_product: cannot_add_item_to_canceled_order: "A törölt rendeléshez nem lehet tételt hozzáadni" include_out_of_stock_variants: "Tartalmazza azokat a változatokat, amelyeknél nincs raktárkészlet" + shipment: + mark_as_shipped_message_html: "Ezzel a megrendelést KISZÁLLÍTVA-ként jelölöd meg. Biztos, hogy folytatni szeretnéd?" + mark_as_shipped_label_message: "Szállítási/átvételi értesítő e-mail küldése az ügyfélnek." index: listing_orders: "Megrendelések listája" new_order: "Új rend" @@ -3798,10 +3957,18 @@ hu: results_found: "%{number} találat." viewing: "%{start} – %{end} megtekintése." print_invoices: "Számlák nyomtatása" + cancel_orders: "Rendelések törlése" resend_confirmation: "Visszaigazolás újraküldése" + resend_confirmation_confirm_html: "Ezzel újra elküldöd a visszaigazoló e-mailt az ügyfélnek. Biztos, hogy folytatni szeretnéd?" + send_invoice: "Számlák kiküldése" + send_invoice_confirm_html: "Ez a funkció az összes kiválasztott KÉSZ (státuszú) megrendelésről szóló számlát elküldi a vásárlónak e-mailben.
Biztos, hogy folytatni szeretnéd?" + selected: + zero: "Nincs kiválasztott rendelés" + one: "1 rendelés kiválasztva" + other: "%{count}rendelés kiválasztva" sortable_header: - payment_state: "Fizetési állapot" - shipment_state: "Szállítási állapot" + payment_state: "Fizetési státusz" + shipment_state: "Szállítási Státusz" completed_at: "Elkészült:" number: "Szám" state: "Ország" @@ -3812,9 +3979,12 @@ hu: code: "Kód" to: "Bill to" shipping: "Szállítás" + order_number: "Rendelési sorszám" + invoice_number: "A számla sorszáma" payments_list: - date_time: "Dátum idő" + date_time: "Dátum/idő" payment_method: "Fizetési mód" + payment_state: "Fizetési Státusz" amount: "Összeg" note: note_label: "Megjegyzés:" @@ -3827,9 +3997,12 @@ hu: line_item_adjustments: "Sorok korrekciói" order_adjustments: "Rendelési módosítások" order_total: "Rendelés Összesen" + invoices: + index: + order_has_changed: "A rendelés megváltozott a legutóbbi számlafrissítés óta. Előfordulhat, hogy az itt megjelenített számla már nem aktuális." overview: enterprises_header: - ofn_with_tip: A vállalkozások termelők és/vagy központok, és az Open Food Network szervezeti egységei. + ofn_with_tip: A termelők, kisvállalkozások, élelmiszer központok, élelmiszer közösségek, termelői piacok az Open Food Network szervezeti egységei. enterprise_row: has_no_enterprise_fees: "nincs vállalkozási díja" has_no_payment_methods: "nincs fizetési mód" @@ -3907,7 +4080,7 @@ hu: account_missing_msg: Ehhez a vállalkozáshoz nem tartozik Stripe-fiók. connect_one: Connect One access_revoked_msg: Stripe-fiókhoz való hozzáférést visszavonták," kérjük, csatlakoztassa újra fiókját. - status: Állapot + status: Státusz connected: csatlakoztatva account_id: felhasználónév business_name: Vállalkozás neve @@ -3939,6 +4112,7 @@ hu: paypal: no_payment_via_admin_backend: A Paypal fizetések nem rögzíthetők a Backoffice-ban products: + image_upload_error: "Kérjük, a képet JPG, PNG, GIF, SVG vagy WEBP formátumban töltsd fel." new: title: "Új termék" new_product: "Új termék" @@ -3983,11 +4157,16 @@ hu: bulk_unit_size: Tömeges mértékegység display_as: display_as: Megjelenítés mint + clone: + success: A termék klónozva lett reports: table: select_and_search: "Válaszd ki a szűrőket, és kattintson a %{option} elemre az adatok eléréséhez." customer_names_message: customer_names_tip: "Ha az Ön által szállított rendeléseknél a vásárlók nevei el vannak rejtve, felveheti a kapcsolatot a forgalmazóval, és megkérdezheti, hogy frissítheti-e átvételi ponti beállításait, hogy beszállítóik megtekinthessék a vásárlók nevét." + products_and_inventory: + all_products: + message: "Felhívjuk a figyelmed arra, hogy a megadott készletszintek csak a beszállítói terméklistákból származnak. Ha a készletmennyiségek kezelésére a Készletnyilvántartást használod, akkor ezeket az értékeket a jelentés nem veszi figyelembe." users: index: listing_users: "Felhasználók listázása" @@ -4006,6 +4185,7 @@ hu: enterprise_limit: "Vállalkozási korlát" confirm_password: "Jelszó megerősítése" password: "Jelszó" + locale: "Nyelv" email_confirmation: confirmation_pending: "Az e-mail megerősítés függőben van. Megerősítő e-mailt küldtünk a következő címre: %{address}." variants: @@ -4041,9 +4221,9 @@ hu: name: "Név" number: "Szám" completed_at: "Elkészült:" - state: "Állapot" - payment_state: "Fizetési állapot" - shipment_state: "Szállítási állapot" + state: "Státusz" + payment_state: "Fizetési Státusz" + shipment_state: "Szállítási Státusz" email: "Email" total: "Összesen" billing_address_name: "Név" @@ -4051,7 +4231,11 @@ hu: form: name: Név permalink: Permalink + meta_title: Meta Cím (SEO cím) + meta_description: Meta Leírás + meta_keywords: Meta Kulcsszavak description: Leírás + dfc_id: DFC URI general_settings: edit: legal_settings: "Jogi beállítások" @@ -4096,7 +4280,7 @@ hu: partial: részleges pending: függőben levő ready: kész - shipped: kiszállított + shipped: kiszállítva canceled: törölve payment_states: balance_due: fizetendő összeg @@ -4116,16 +4300,16 @@ hu: customer_greeting: "Kedves %{name}!" instructions_html: "Megrendelését a(z) %{distributor}-tól TÖRÖLTE. Kérjük, őrizze meg ezt a törlési információt saját nyilvántartása céljából." dont_cancel: "Ha meggondoltad magad, vagy nem szeretnéd lemondani ezt a rendelést, fordulj a %{email}" - order_summary_canceled_html: "Megrendelés összegzése" + order_summary_canceled_html: "Megrendelés összegzése #%{number}[TÖRÖLVE] " details: "Itt vannak a megrendelt termékek részletei:" - unpaid_order: "Megrendelését nem fizették ki, így a visszatérítés nem történt" - paid_order: "Megrendelését kifizették, így %{distributor} visszatérítette a teljes összeget" + unpaid_order: "Megrendelésed nem lett kifizetve, így visszatérítés nem történt" + paid_order: "Megrendelésed fizetésre került, így %{distributor} visszatérítette a teljes összeget" credit_order: "Megrendelését kifizették, így jóváírásra került a számláján" subject: "Megrendelés törlése" cancel_email_for_shop: greeting: "Kedves %{name}!" subject: "Megrendelés törlése" - intro: "Egy ügyfél törölte a" + intro: "Egy ügyfél törölte a rendelését #%{number}" view_cancelled_order: "A törölt rendelés megtekintése" confirm_email: subject: "Megrendelés visszaigazolás" @@ -4155,12 +4339,14 @@ hu: shipment_mailer: shipped_email: dear_customer: "Tisztelt Ügyfelünk," - instructions: "Megrendelését a(z) %{distributor}-tól elküldtük" + instructions: "Megrendelésed a(z) %{distributor}-tól elküldtük" shipment_summary: "Szállítási összefoglaló" subject: "Szállítási értesítés" thanks: "Köszönjük üzletét." track_information: "Követési információ: %{tracking}" track_link: "! Követő link: %{url}" + picked_up_instructions: "Az Ön megrendelését %{distributor}termelőtől felvettük." + picked_up_subject: "Átvételi értesítés/megjegyzés" test_mailer: test_email: greeting: "Gratulálunk!" @@ -4208,10 +4394,24 @@ hu: users: api_keys: regenerate_key: "Kulcs újragenerálása" + title: API kulcs + webhook_endpoints: + title: Webhook végpontok + description: A rendszerben bekövetkező események webhookokat indíthatnak külső rendszerek felé. + event_types: + order_cycle_opened: Rendelési ciklus megnyitva + event_type: + header: Esemény típusa + url: + header: Végpont URL + create_placeholder: Adja meg a távoli webhook végpont URL-címét + developer_settings: + title: Fejlesztői beállítások form: account_settings: Fiók beállítások show: tabs: + developer_settings: Fejlesztői beállítások orders: Megrendelések cards: Bankkártyák transactions: Tranzakciók @@ -4231,7 +4431,7 @@ hu: items: Tételek total: Összesen edit: Szerkesztés - cancel: Vissza + cancel: Törlés closed: Zárva until: Amíg past_orders: @@ -4241,7 +4441,8 @@ hu: items: Tételek total: Összesen paid?: Fizetett? - status: Állapot + status: Státusz + completed: Elkészült cancelled: Törölve saved_cards: default?: Alapértelmezett? @@ -4253,6 +4454,7 @@ hu: authorised_shops: shop_name: "Átvételi pont neve" allow_charges?: "Engedélyezi a terhelést az alapértelmezett kártyára?" + no_default_saved_cards_tooltip: Egy hitelkártyát alapértelmezettként kell megjelölnie a terhelések engedélyezéséhez. localized_number: invalid_format: formátuma érvénytelen. Kérjük, adjon meg egy számot. api: @@ -4269,14 +4471,16 @@ hu: key_generated: "Kulcs generálva" key_cleared: "Kulcs törölve" shipment: - cannot_ready: "Nem lehet kész a szállítás." + cannot_ready: "Nem áll készen a szállításra." invalid_taxonomy_id: "Érvénytelen termék kategória azonosító." + toggle_api_key_view: "API-kulcs nézet megjelenítése a felhasználó számára" activerecord: models: spree/payment: one: Fizetés other: Kifizetések - unit: Mértékegység + unit: mértékegység + per_unit: egységenként datetime: distance_in_words: about_x_hours: @@ -4317,10 +4521,16 @@ hu: one: "1 év" other: "%{count} év" components: + multiple_checked_select: + filter_placeholder: "Szűrési lehetőségek" search_input: placeholder: Keresés selector_with_filter: + selected_items: "%{count}kiválasztva" search_placeholder: Keresés pagination: next: Következő previous: Előző + invisible_captcha: + sentence_for_humans: "Kérjük hagyja üresen" + timestamp_error_message: "Kérjük, próbáld meg 5 másodperc múlva." diff --git a/config/locales/it.yml b/config/locales/it.yml index c5ad8a82e2c..b422787326f 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -498,6 +498,7 @@ it: edit: Modifica clone: Duplica delete: Annulla + remove: Rimuovi image: edit: Modifica adjustments: @@ -727,8 +728,12 @@ it: clear_search: Pulisci ricerca table: new_variant: Nuova variante - edit_image: - close: Indietro + variant_row: + none_tax_category: Nessuno + category_field_name: "Categoria" + tax_category_field_name: "Categoria d'imposta" + product_row: + producer_field_name: "Produttore" product_import: title: Importa prodotto file_not_found: Documento non trovato o non disponibile @@ -1870,7 +1875,6 @@ it: label_account: "Account" label_more: "Mostra di più" label_less: "Mostra meno" - label_notices: "Avvisi" cart_items: "articoli" cart_headline: "Il tuo carrello" total: "Totale" @@ -3741,6 +3745,9 @@ it: validation: must_be_int: "deve essere un numero intero" admin: + images: + edit: + close: Indietro mail_methods: send_testmail: "Invia mail prova" testmail: @@ -3768,6 +3775,10 @@ it: customers: "Clienti" groups: "Reti" oidc_settings: "Impoostazioni" + overview: "Panoramica" + product_import: "Importazione" + enterprise_roles: "Ruoli" + payment_methods: "Metodi di Pagamento" product_properties: index: inherits_properties_checkbox_hint: "Eredita le proprietà da %{supplier}? (se non sovrascritto)" diff --git a/config/locales/it_CH.yml b/config/locales/it_CH.yml index ea951827a5a..a4710118645 100644 --- a/config/locales/it_CH.yml +++ b/config/locales/it_CH.yml @@ -445,6 +445,7 @@ it_CH: edit: Modifica clone: Duplica delete: Annulla + remove: Rimuovi image: edit: Modifica adjustments: @@ -669,8 +670,12 @@ it_CH: clear_search: Pulisci ricerca table: new_variant: Nuova variante - edit_image: - close: Indietro + variant_row: + none_tax_category: Nessuno + category_field_name: "Categoria" + tax_category_field_name: "Categoria di imposta" + product_row: + producer_field_name: "Produttore" product_import: title: Importa prodotto file_not_found: Documento non trovato o non disponibile @@ -1769,7 +1774,6 @@ it_CH: label_account: "Account" label_more: "Mostra di più" label_less: "Mostra meno" - label_notices: "Avvisi" cart_items: "articoli" cart_headline: "Il tuo carrello" total: "Totale" @@ -3598,6 +3602,9 @@ it_CH: validation: must_be_int: "deve essere un numero intero" admin: + images: + edit: + close: Indietro mail_methods: send_testmail: "Invia mail prova" testmail: @@ -3624,6 +3631,10 @@ it_CH: enterprise_relationships: "permessi" customers: "Clienti" groups: "Reti" + overview: "Panoramica" + product_import: "Importazione" + enterprise_roles: "Ruoli" + payment_methods: "Metodi di pagamento" product_properties: index: inherits_properties_checkbox_hint: "Eredita le proprietà da %{supplier}? (se non sovrascritto)" diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 2484c4f61fd..d12529c8252 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -468,6 +468,7 @@ ko: edit: 편집 clone: 복사 delete: 삭제 + remove: 제거 image: edit: 편집 adjustments: @@ -692,8 +693,12 @@ ko: clear_search: 검색 지우기 table: new_variant: 새로운 변경사항 - edit_image: - close: 뒤로 + variant_row: + none_tax_category: None + category_field_name: "목록" + tax_category_field_name: "세금 목록" + product_row: + producer_field_name: "제공자" product_import: title: 제품 가져오기 file_not_found: 파일을 찾을 수 없거나 열 수 없습니다. @@ -1798,7 +1803,6 @@ ko: label_account: "계정" label_more: "더 보기" label_less: "적게 표시" - label_notices: "공지사항" cart_items: "항목" cart_headline: "당신의 쇼핑 카트" total: "총합" @@ -3564,6 +3568,9 @@ ko: validation: must_be_int: "정수여야 합니다" admin: + images: + edit: + close: 뒤로 mail_methods: send_testmail: "테스트 이메일 보내기" testmail: @@ -3590,6 +3597,10 @@ ko: enterprise_relationships: "사용 권한" customers: "소비자" groups: "그룹" + overview: "개요" + product_import: "수입" + enterprise_roles: "역할" + payment_methods: "결제 방법" product_properties: index: inherits_properties_checkbox_hint: "%{supplier} 속성을 상속하시겠습니까? (위에서 재정의하지 않는 경우)" diff --git a/config/locales/ml.yml b/config/locales/ml.yml index 7126238da96..15a9234e9ab 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -137,7 +137,8 @@ ml: unprocessable_entity: title: "നിങ്ങൾ ആഗ്രഹിച്ച മാറ്റം നിരസിക്കപ്പെട്ടു (422)" message_html: "

നിങ്ങൾ ആഗ്രഹിച്ച മാറ്റം നിരസിക്കപ്പെട്ടു. നിങ്ങൾക്ക് അനുമതി ഇല്ലാത്ത എന്തെങ്കിലും മാറ്റാൻ നിങ്ങൾ ശ്രമിച്ചിരിക്കാം.

ഹോം പേജിലേക്ക് തിരിച്ചുപോകുക

" - stimulus_reflex_error: "ക്ഷമിക്കണം, എന്തോ കുഴപ്പം സംഭവിച്ചു.\n\n ഇതൊരു താൽക്കാലിക പ്രശ്നമായിരിക്കാം, അതിനാൽ ദയവായി വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ പേജ് റീലോഡ് ചെയ്യുക.\n ഞങ്ങൾ എല്ലാ പ്രശ്നങ്ങളും രേഖപ്പെടുത്തുന്നുണ്ട്, ചിലപ്പോൾ ഒരു പരിഹാരത്തിനായി പ്രവർത്തിച്ചുകൊണ്ടിരിക്കുകയും ആകാം\n പ്രശ്നം നിലനിൽക്കുന്നുവെങ്കിലോ അല്ലെങ്കിൽ ആത്യാവശ്യമോ ആണെങ്കിൽ, ദയവായി ഞങ്ങളുമായി ബന്ധപ്പെടുക. " + general_error: + message: "ക്ഷമിക്കണം, എന്തോ കുഴപ്പം സംഭവിച്ചു.\n\n ഇതൊരു താൽക്കാലിക പ്രശ്നമായിരിക്കാം, അതിനാൽ ദയവായി വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ പേജ് റീലോഡ് ചെയ്യുക.\n ഞങ്ങൾ എല്ലാ പ്രശ്നങ്ങളും രേഖപ്പെടുത്തുന്നുണ്ട്, ചിലപ്പോൾ ഒരു പരിഹാരത്തിനായി പ്രവർത്തിച്ചുകൊണ്ടിരിക്കുകയും ആകാം\n പ്രശ്നം നിലനിൽക്കുന്നുവെങ്കിലോ അല്ലെങ്കിൽ ആത്യാവശ്യമോ ആണെങ്കിൽ, ദയവായി ഞങ്ങളുമായി ബന്ധപ്പെടുക. " stripe: error_code: incorrect_number: "കാർഡ് നമ്പർ തെറ്റാണ്." @@ -534,6 +535,7 @@ ml: edit: എഡിറ്റ് ചെയ്യുക clone: ക്ലോൺ delete: ഡിലീറ്റ് ചെയ്യുക + remove: നീക്കം ചെയ്യുക image: edit: എഡിറ്റ് ചെയ്യുക adjustments: @@ -755,6 +757,7 @@ ml: index: header: title: ഉൽപ്പന്നങ്ങൾ മൊത്തമായി തിരുത്തുക + content: loading: നിങ്ങളുടെ ഉൽപ്പന്നങ്ങൾ ലോഡ് ചെയ്യുന്നു filters: search_products: ഉൽപ്പന്നങ്ങൾക്കായി തിരയുക @@ -792,8 +795,12 @@ ml: new_variant: പുതിയ വേരിയന്റ് bulk_update: success: മാറ്റങ്ങൾ സേവ് ചെയ്തു. - edit_image: - close: തിരികെ + variant_row: + none_tax_category: ഒന്നുമില്ല + category_field_name: "വിഭാഗം" + tax_category_field_name: "നികുതി വിഭാഗം" + product_row: + producer_field_name: "പ്രൊഡ്യൂസർ" product_import: title: ഉൽപ്പന്ന ഇറക്കുമതി file_not_found: ഫയൽ കണ്ടെത്തിയില്ല അല്ലെങ്കിൽ തുറക്കാൻ കഴിഞ്ഞില്ല @@ -2018,7 +2025,6 @@ ml: label_account: "അക്കൗണ്ട്" label_more: "കൂടുതൽ കാണിക്കുക" label_less: "കുറച്ചുമാത്രം കാണിക്കുക" - label_notices: "അറിയിപ്പുകൾ" cart_items: "ഇനങ്ങൾ" cart_headline: "നിങ്ങളുടെ ഷോപ്പിംഗ് കാർട്ട്" total: "ആകെ" @@ -3899,6 +3905,9 @@ ml: validation: must_be_int: "ഒരു പൂർണ്ണസംഖ്യ ആയിരിക്കണം" admin: + images: + edit: + close: തിരികെ mail_methods: send_testmail: "ടെസ്റ്റ് ഇമെയിൽ അയയ്ക്കുക" testmail: @@ -3926,6 +3935,10 @@ ml: customers: "ഉപഭോക്താക്കൾ" groups: "ഗ്രൂപ്പുകൾ" oidc_settings: "ഓഐഡിസി ക്രമീകരണങ്ങൾ" + overview: "അവലോകനം" + product_import: "ഇറക്കുമതി ചെയ്യുക" + enterprise_roles: "കർത്തവ്യങ്ങൾ" + payment_methods: "പേയ്മെന്റ് രീതികൾ" product_properties: index: inherits_properties_checkbox_hint: "%{supplier} ൽ നിന്ന് പ്രോപ്പർട്ടികൾ അവകാശമാക്കണോ? (മുകളിൽ അസാധുവായില്ലെങ്കിൽ)" diff --git a/config/locales/mr.yml b/config/locales/mr.yml index df80ca985cb..9a80956de5f 100644 --- a/config/locales/mr.yml +++ b/config/locales/mr.yml @@ -137,7 +137,8 @@ mr: unprocessable_entity: title: "तुम्हाला हवा असलेला बदल नाकारण्यात आला (422)" message_html: "

तुम्हाला हवा असलेला बदल नाकारण्यात आला. कदाचित तुम्ही असे काहीतरी बदलण्याचा प्रयत्न केला आहे ज्यामध्ये तुम्हाला प्रवेश नाही.

होम मध्ये परता

" - stimulus_reflex_error: "क्षमस्व, पण काहीतरी चुकले आहे.\n\n ही एक तात्पुरती समस्या असू शकते, म्हणून कृपया पुन्हा प्रयत्न करा किंवा पृष्ठ रीलोड करा.\n आम्ही सर्व एरर रेकॉर्ड करतो आणि कदाचित निराकरण करण्यासाठी कार्य करत आहोत.\n समस्या कायम राहिल्यास किंवा तातडीची असल्यास, कृपया आमच्याशी संपर्क साधा." + general_error: + message: "क्षमस्व, पण काहीतरी चुकले आहे.\n\n ही एक तात्पुरती समस्या असू शकते, म्हणून कृपया पुन्हा प्रयत्न करा किंवा पृष्ठ रीलोड करा.\n आम्ही सर्व एरर रेकॉर्ड करतो आणि कदाचित निराकरण करण्यासाठी कार्य करत आहोत.\n समस्या कायम राहिल्यास किंवा तातडीची असल्यास, कृपया आमच्याशी संपर्क साधा." stripe: error_code: incorrect_number: "कार्ड क्रमांक चुकीचा आहे." @@ -751,7 +752,6 @@ mr: index: header: title: मोठ्या प्रमाणात उत्पादने संपादित करा - loading: तुमची उत्पादने लोड करत आहे filters: search_products: उत्पादने शोधा all_producers: सर्व उत्पादक @@ -785,6 +785,11 @@ mr: other: "%{count} उत्पादने जतन करणे शक्य नाही. कृपया एरर्सचे पुनरावलोकन करा आणि पुन्हा प्रयत्न करा." reset: बदल जतन करू नका save: बदल जतन करा + variant_row: + none_tax_category: कोणतेही नाही + category_field_name: "श्रेणी" + product_row: + producer_field_name: "उत्पादक" product_import: title: उत्पादन आयात file_not_found: फाइल सापडली नाही किंवा उघडता आली नाही @@ -1936,7 +1941,6 @@ mr: label_account: "खाते" label_more: "अजून दाखवा" label_less: "कमी दाखवा" - label_notices: "नोटीस" cart_items: "वस्तू" cart_headline: "तुमची शॉपिंग कार्ट" total: "एकूण" @@ -3832,6 +3836,8 @@ mr: customers: "ग्राहक" groups: "गट" oidc_settings: "OIDC सेटिंग्ज" + product_import: "Import करा" + payment_methods: "पेमेंट पद्धती" product_properties: index: inherits_properties_checkbox_hint: "%{supplier} कडून गुणधर्म मिळवायचे? (वर ओव्हरराईड केल्याशिवाय)" diff --git a/config/locales/nb.yml b/config/locales/nb.yml index 3fe54ffd612..86837fac94c 100644 --- a/config/locales/nb.yml +++ b/config/locales/nb.yml @@ -141,7 +141,8 @@ nb: unprocessable_entity: title: "Endringen du ønsket ble avvist (422)" message_html: "

Endringen du ønsket ble avvist. Kanskje du prøvde å endre noe du ikke har tilgang til.

Vend hjem

" - stimulus_reflex_error: "Vi beklager, men noe gikk galt.\n\nDette kan være et midlertidig problem, så prøv igjen eller last inn siden på nytt.\nVi registrerer alle feil og jobber kanskje med å fikse.\nHvis problemet vedvarer eller haster, vennligst kontakt oss." + general_error: + message: "Vi beklager, men noe gikk galt.\n\nDette kan være et midlertidig problem, så prøv igjen eller last inn siden på nytt.\nVi registrerer alle feil og jobber kanskje med å fikse.\nHvis problemet vedvarer eller haster, vennligst kontakt oss." stripe: error_code: incorrect_number: "Kortnummeret er feil." @@ -194,6 +195,9 @@ nb: transaction_not_allowed: "Kortet har blitt avvist av ukjent årsak." try_again_later: "Kortet har blitt avvist av ukjent årsak." withdrawal_count_limit_exceeded: "Kunden har overskredet saldoen eller kredittgrensen som er tilgjengelig på kortet sitt." + disconnect_failure: "Kunne ikke koble fra Stripe." + success_code: + disconnected: "Stripe-kontoen er koblet fra." activemodel: errors: messages: @@ -219,10 +223,16 @@ nb: not_available_to_shop: "er ikke tilgjengelig for %{shop}" card_details: "Kortdetaljer" card_type: "Korttype" + card_type_is: "Korttype er" + unrecognized_card_type: "Ukjent korttype" + use_new_cc: "Bruk et nytt kredittkort" + what_is_this: "Hva er dette?" cardholder_name: "Kortholders navn" community_forum_url: "URL for diskusjonsforum" customer_instructions: "Kundeinstruksjoner" additional_information: "Tilleggsinformasjon" + connect_app: + url: "https://n8n.openfoodnetwork.org/webhook/regen/connect-enterprise" devise: passwords: spree_user: @@ -512,8 +522,10 @@ nb: colums: Kolonner columns: name: Navn + unit_scale: Enhetsskala unit: Enhet unit_value: Enhetsverdi + display_as: Vis enhet som price: Pris producer: Produsent category: Kategori @@ -539,6 +551,7 @@ nb: edit: Rediger clone: Klon delete: Slett + remove: Fjern image: edit: Rediger adjustments: @@ -643,6 +656,7 @@ nb: status: Status ok: Ok instance_secret_key: Instans Secret Key + instance_publishable_key: Instans Publiserbar nøkkel account_id: Konto-ID business_name: Bedriftsnavn charges_enabled: Avgifter Aktivert @@ -695,6 +709,10 @@ nb: your_content: Ditt innhold user_guide: Brukermanual map: Kart + dfc_product_imports: + index: + title: "Importere en DFC-produktkatalog" + imported_products: "Importerte produkter:" enterprise_fees: index: title: "Bedriftsavgifter" @@ -760,6 +778,7 @@ nb: index: header: title: Endre produkter i bulk + content: loading: Laster inn produktene dine delete_modal: delete_product_modal: @@ -810,16 +829,19 @@ nb: new_variant: Ny variant bulk_update: success: Endringer lagret - edit_image: - title: Rediger produktbilde - close: Tilbake - upload: Last opp bilde delete_product: success: Produktet ble slettet error: Kan ikke slette produktet delete_variant: success: Varianten ble slettet error: Kan ikke slette varianten + variant_row: + none_tax_category: Ingen + search_for_tax_categories: "Søk etter avgiftskategorier" + category_field_name: "Kategori" + tax_category_field_name: "Avgiftskategori" + product_row: + producer_field_name: "Produsent" product_import: title: Produktimport file_not_found: Filen ble ikke funnet eller kunne ikke åpnes @@ -862,7 +884,9 @@ nb: tax_categories: Avgiftskategorier shipping_categories: Fraktkategorier dfc_import_form: + title: "Importer fra DFC-katalogen" enterprise: "Bedrift" + catalog_url: "DFC-katalog-URL" import: "Import" import: review: Anmeldelse @@ -1172,6 +1196,7 @@ nb: open_date: "Åpningsdato" close_date: "Stengedato" display_ordering_in_shopfront: "Vis sortering i butikken:" + shopfront_sort_by_product: "Etter produkt" shopfront_sort_by_category: "Etter kategori" shopfront_sort_by_producer: "Etter produsent" shopfront_sort_by_category_placeholder: "Kategori" @@ -1260,6 +1285,7 @@ nb: enable: "Tillat datadeling" disable: "Stopp deling" loading: "Laster" + need_to_be_manager: "Bare ledere kan koble til apper." note: | Open Food Network-kontoen din er koblet til Discover Regenerativ. Legg til eller oppdater informasjon om Discover Regenerativ-oppføringen din her. @@ -2066,7 +2092,6 @@ nb: label_account: "Konto" label_more: "Vis mer" label_less: "Vis mindre" - label_notices: "Meldinger" cart_items: "Elementer" cart_headline: "Din handlekurv" total: "Sum" @@ -2478,6 +2503,7 @@ nb: orders_bought_already_confirmed: "* allerede bekreftet" orders_confirm_cancel: "Er du sikker på at du vil avbryte denne bestillingen?" order_processed_successfully: "Behandlingen av din bestilling var vellykket" + thank_you_for_your_order: "Takk for din bestilling" products_cart_distributor_choice: "Distributør for bestillingen:" products_cart_distributor_change: "Din distributør for denne ordren vil bli endret til %{name} hvis du legger til dette produktet i handlekurven din." products_cart_distributor_is: "Din distributør for denne ordren er %{name}." @@ -3699,6 +3725,7 @@ nb: editing_tax_category: "Redigering av avgiftskategori" editing_tax_rate: "Redigering av avgiftssats" editing_zone: "Redigeringssone" + editing_state: "Redigerer regioner" expiration: "Utløp" invalid_payment_provider: "Ugyldig betalingsleverandør" items_cannot_be_shipped: "Varer kan ikke sendes" @@ -3727,6 +3754,8 @@ nb: start_date: "Startdato" successfully_removed: "Fjernet OK" taxonomy_edit: "Rediger kategori" + taxonomy_tree_error: "Det oppsto en feil under oppdatering av kategoritreet." + taxonomy_tree_instruction: "Høyreklikk på et element for å legge til, gi nytt navn, fjerne eller redigere." tree: "Tre" updating: "Oppdaterer" your_order_is_empty_add_product: "Bestillingen din er tom, vennligst søk etter og legg til et produkt over" @@ -3735,6 +3764,7 @@ nb: resend: "Send på nytt" back_to_orders_list: "Tilbake til Bestillingsliste" back_to_payments_list: "Tilbake til betalingsliste" + back_to_states_list: "Tilbake til liste over regioner" return_authorizations: "Returautorisasjoner" cannot_create_returns: "Kan ikke opprette retur da denne bestillingen ikke har noen sendte elementer." select_stock: "Velg lager" @@ -3937,6 +3967,11 @@ nb: validation: must_be_int: "må være et heltall" admin: + images: + edit: + title: Rediger produktbilde + close: Tilbake + upload: Last opp bilde mail_methods: send_testmail: "Send test-epost" testmail: @@ -3964,6 +3999,10 @@ nb: customers: "Kunder" groups: "Grupper" oidc_settings: "OIDC-innstillinger" + overview: "Oversikt" + product_import: "Import" + enterprise_roles: "Roller" + payment_methods: "Betalingsmetoder" product_properties: index: inherits_properties_checkbox_hint: "Arve egenskaper fra %{supplier}? (med mindre overstyrt over)" diff --git a/config/locales/nl_BE.yml b/config/locales/nl_BE.yml index df9de41f92b..a91597ee5e1 100644 --- a/config/locales/nl_BE.yml +++ b/config/locales/nl_BE.yml @@ -341,6 +341,7 @@ nl_BE: edit: bewerking clone: Kloon delete: 'Uitwissen ' + remove: Verwijderen image: edit: bewerking begins_at: Begint Bij @@ -549,8 +550,12 @@ nl_BE: clear_search: Verwijder zoektermen table: new_variant: Nieuw variant - edit_image: - close: achterstevoren + variant_row: + none_tax_category: Geen enkele + category_field_name: "Categorie" + tax_category_field_name: "Belastingcategorie" + product_row: + producer_field_name: "Producent" product_import: title: Importeren van producten file_not_found: Bestand niet gevonden of kon niet worden geopend @@ -1415,8 +1420,8 @@ nl_BE: cart_sidebar: checkout: "Kassa" edit_cart: "Winkelwagen aanpassen" - items_in_cart_singular: "%{num}items in uw winkelkwagentje" - items_in_cart_plural: "%{num}items in uw winkelkwagentje" + items_in_cart_singular: "%{num} items in uw winkelwagentje" + items_in_cart_plural: "%{num} items in uw winkelwagentje" close: "Sluit" cart_empty: "Uw winkelwagen is leeg" take_me_shopping: "Neem me shoppen!" @@ -1556,7 +1561,6 @@ nl_BE: label_account: "Account" label_more: "Toon meer" label_less: "Toon minder" - label_notices: "Info" cart_items: "Artikels" cart_headline: "Je winkelwagentje" total: "Totaal" @@ -3176,6 +3180,9 @@ nl_BE: header: store: Zicht koper admin: + images: + edit: + close: achterstevoren subscriptions: number: "Nummer" tab: @@ -3196,6 +3203,10 @@ nl_BE: enterprise_relationships: "Toelatingen" customers: "Klanten" groups: "Groepen" + overview: "Overzicht" + product_import: "Importeren" + enterprise_roles: "Rollen" + payment_methods: "Betalingsmethode" product_properties: index: inherits_properties_checkbox_hint: "De kenmerken van 1%{supplier} krijgen ? (niet ter toepassing in geval van invoer van de vervanging)" diff --git a/config/locales/pa.yml b/config/locales/pa.yml index 426a2276551..59aea3be316 100644 --- a/config/locales/pa.yml +++ b/config/locales/pa.yml @@ -134,7 +134,8 @@ pa: unprocessable_entity: title: "ਜੋ ਬਦਲਾਅ ਤੁਸੀਂ ਚਾਹੁੰਦੇ ਸੀ ਉਹ ਰੱਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਸੀ (422)" message_html: "

ਜੋ ਬਦਲਾਅ ਤੁਸੀਂ ਚਾਹੁੰਦੇ ਸੀ ਉਹ ਰੱਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਸੀ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਕਿਸੇ ਅਜਿਹੀ ਚੀਜ਼ ਨੂੰ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਹੋਵੇ ਜਿਸ ਤੱਕ ਤੁਹਾਡੀ ਪਹੁੰਚ ਨਹੀਂ ਹੈ।

ਹੋਮ ਤੇ ਵਾਪਸ ਜਾਓ

" - stimulus_reflex_error: "ਸਾਨੂੰ ਅਫਸੋਸ ਹੈ, ਪਰ ਕੁਝ ਗਲਤ ਹੋਇਆ ਹੈ।\\n\\nਇਹ ਇੱਕ ਅਸਥਾਈ ਸਮੱਸਿਆ ਹੋ ਸਕਦੀ ਹੈ, ਇਸ ਲਈ ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਪੰਨੇ ਨੂੰ ਦੋਬਾਰਾ ਲੋਡ ਕਰੋ।\\nਅਸੀਂ ਸਾਰੀਆਂ ਤਰੁੱਟੀਆਂ ਨੂੰ ਰਿਕਾਰਡ ਕਰਦੇ ਹਾਂ ਅਤੇ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਅਸੀਂ ਉਨਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਤੇ ਕੰਮ ਰਹੇ ਹੋਈਏ।\\nਜੇਕਰ ਸਮੱਸਿਆ ਬਣੀ ਰਹਿੰਦੀ ਹੈ ਜਾਂ ਜ਼ਰੂਰੀ ਹੈ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਸਾਡੇ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" + general_error: + message: "ਸਾਨੂੰ ਅਫਸੋਸ ਹੈ, ਪਰ ਕੁਝ ਗਲਤ ਹੋਇਆ ਹੈ।\\n\\nਇਹ ਇੱਕ ਅਸਥਾਈ ਸਮੱਸਿਆ ਹੋ ਸਕਦੀ ਹੈ, ਇਸ ਲਈ ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਪੰਨੇ ਨੂੰ ਦੋਬਾਰਾ ਲੋਡ ਕਰੋ।\\nਅਸੀਂ ਸਾਰੀਆਂ ਤਰੁੱਟੀਆਂ ਨੂੰ ਰਿਕਾਰਡ ਕਰਦੇ ਹਾਂ ਅਤੇ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਅਸੀਂ ਉਨਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਤੇ ਕੰਮ ਰਹੇ ਹੋਈਏ।\\nਜੇਕਰ ਸਮੱਸਿਆ ਬਣੀ ਰਹਿੰਦੀ ਹੈ ਜਾਂ ਜ਼ਰੂਰੀ ਹੈ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਸਾਡੇ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" stripe: error_code: incorrect_number: "ਕਾਰਡ ਨੰਬਰ ਗਲਤ ਹੈ।" @@ -527,6 +528,7 @@ pa: edit: ਸੰਪਾਦਿਤ ਕਰੋ clone: ਕਲੋਨ delete: ਹਟਾਓ + remove: Remove image: edit: ਸੰਪਾਦਿਤ ਕਰੋ adjustments: @@ -744,6 +746,7 @@ pa: index: header: title: ਥੋਕ ਸੰਪਾਦਿਤ ਉਤਪਾਦ + content: loading: ਤੁਹਾਡੇ ਉਤਪਾਦ ਲੋਡ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ filters: search_products: ਉਤਪਾਦਾਂ ਦੀ ਖੋਜ ਕਰੋ @@ -771,8 +774,12 @@ pa: new_variant: ਨਵਾਂ ਵੇਰੀਐਂਟ bulk_update: success: ਬਦਲਾਵ ਸੇਵ ਕੀਤੇ ਗਏ।' - edit_image: - close: ਵਾਪਸ + variant_row: + none_tax_category: ਕੋਈ ਨਹੀਂ + category_field_name: "ਸ਼੍ਰੇਣੀ" + tax_category_field_name: "ਟੈਕਸ ਸ਼੍ਰੇਣੀ" + product_row: + producer_field_name: "ਉਤਪਾਦਕ" product_import: title: ਉਤਪਾਦ ਦਾ ਇਮਪੋਰਟ file_not_found: ਫ਼ਾਈਲ ਨਹੀਂ ਮਿਲੀ ਜਾਂ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ @@ -1980,7 +1987,6 @@ pa: label_account: "ਖਾਤਾ" label_more: "ਹੋਰ ਵਿਖਾਓ" label_less: "ਘੱਟ ਵਿਖਾਓ" - label_notices: "ਨੋਟਿਸ" cart_items: "ਆਈਟਮਾਂ" cart_headline: "ਤੁਹਾਡਾ ਸ਼ਾਪਿੰਗ ਕਾਰਟ" total: "ਕੁੱਲ" @@ -3769,6 +3775,9 @@ pa: validation: must_be_int: "ਇੱਕ ਪੂਰਨ ਅੰਕ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" admin: + images: + edit: + close: ਵਾਪਸ mail_methods: send_testmail: "ਟੈਸਟ ਈਮੇਲ ਭੇਜੋ" testmail: @@ -3796,6 +3805,10 @@ pa: customers: "ਗਾਹਕ" groups: "ਸਮੂਹ" oidc_settings: "OIDC ਸੈਟਿੰਗਾਂ" + overview: "ਸੰਖੇਪ ਜਾਣਕਾਰੀ" + product_import: "ਇਮਪੋਰਟ" + enterprise_roles: "ਭੂਮਿਕਾਵਾਂ" + payment_methods: "ਭੁਗਤਾਨ ਦੇ ਢੰਗ" product_properties: index: inherits_properties_checkbox_hint: "%{supplier} ਤੋਂ ਪ੍ਰੋਪੇਰਟੀਜ਼ ਅਪਣਾਓ? (ਜਦੋਂ ਤੱਕ ਕਿ ਉਪਰ ਓਵਰਰਾਈਡ ਨਾ ਕੀਤਾ ਗਿਆ ਹੋਵੇ)" diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 8348a751382..21d8f6bc9f5 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -337,6 +337,7 @@ pl: edit: Edytuj clone: Kopiuj delete: Usuń + remove: Usuń image: edit: Edytuj begins_at: Początek o @@ -523,8 +524,12 @@ pl: producers: label: Producenci search: Szukaj - edit_image: - close: Wstecz + variant_row: + none_tax_category: Nic + category_field_name: "Kategoria" + tax_category_field_name: "Kategoria podatku" + product_row: + producer_field_name: "Producent" product_import: title: Import produktów file_not_found: Nie znaleziono pliku lub nie można go otworzyć @@ -1446,7 +1451,6 @@ pl: label_account: "Konto" label_more: "Pokaż więcej" label_less: "Pokaż mniej" - label_notices: "Powiadomienia" cart_items: "przedmiotów" cart_headline: "Twój Koszyk" total: "Razem" @@ -3159,6 +3163,9 @@ pl: header: store: Sklep admin: + images: + edit: + close: Wstecz subscriptions: number: "Numer zamówienia" tab: @@ -3179,6 +3186,8 @@ pl: enterprise_relationships: "Uprawnienia" customers: "Klienci" groups: "Grupy" + product_import: "Import" + payment_methods: "Metody płatności" product_properties: index: inherits_properties_checkbox_hint: "Odziedziczyć właściwości z %{supplier}? (chyba że zastąpiono powyżej)" diff --git a/config/locales/pt.yml b/config/locales/pt.yml index 00ab7fc455d..31b97e968c7 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -378,6 +378,7 @@ pt: edit: Editar clone: Clonar delete: Apagar + remove: Remover image: edit: Editar begins_at: Começa às @@ -585,8 +586,12 @@ pt: search: Procurar table: new_variant: Nova variante - edit_image: - close: Voltar + variant_row: + none_tax_category: Nenhum + category_field_name: "Categoria" + tax_category_field_name: "Categoria de Imposto" + product_row: + producer_field_name: "Produtor/a" product_import: title: Importação de Produtos file_not_found: O ficheiro não foi encontrado ou não pôde ser aberto @@ -1573,7 +1578,6 @@ pt: label_account: "Conta" label_more: "Mostrar mais" label_less: "Mostrar menos" - label_notices: "Avisos" cart_items: "itens" cart_headline: "O seu carrinho de compras" total: "Total" @@ -3168,6 +3172,9 @@ pt: header: store: Loja admin: + images: + edit: + close: Voltar subscriptions: number: "Número" tab: @@ -3188,6 +3195,10 @@ pt: enterprise_relationships: "Permissões" customers: "Consumidores/as" groups: "Grupos" + overview: "Visão geral" + product_import: "Importar" + enterprise_roles: "Papeis" + payment_methods: "Métodos de pagamento" product_properties: index: inherits_properties_checkbox_hint: "Herdar propriedades de %{supplier}? (excepto se já alterado em cima)" diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml index 01c66c961e8..7551be99ca2 100644 --- a/config/locales/pt_BR.yml +++ b/config/locales/pt_BR.yml @@ -406,6 +406,7 @@ pt_BR: edit: Editar clone: Cópia delete: Deletar + remove: Remover image: edit: Editar adjustments: @@ -626,8 +627,12 @@ pt_BR: sort: pagination: clear_search: Nova busca - edit_image: - close: Voltar + variant_row: + none_tax_category: Nenhum + category_field_name: "Categoria" + tax_category_field_name: "Categoria de taxa" + product_row: + producer_field_name: "Produtor" product_import: title: Importação de produtos file_not_found: O arquivo não foi encontrado ou não pôde ser aberto @@ -1653,7 +1658,6 @@ pt_BR: label_account: "Conta" label_more: "Mostrar mais" label_less: "Mostrar menos" - label_notices: "Avisos" cart_items: "itens" cart_headline: "seu carrinho de compras" total: "Total" @@ -3455,6 +3459,9 @@ pt_BR: validation: must_be_int: "deve ser um número integral " admin: + images: + edit: + close: Voltar mail_methods: send_testmail: "Enviar email de teste" testmail: @@ -3481,6 +3488,10 @@ pt_BR: enterprise_relationships: "Permissões" customers: "Compradores" groups: "Grupos" + overview: "Visão geral" + product_import: "Importar" + enterprise_roles: "Funções" + payment_methods: "Métodos de pagamento" product_properties: index: inherits_properties_checkbox_hint: "Herdar propriedades de %{supplier}? (a menos que substituído acima)" diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 76076fc356c..a48c8467219 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -141,7 +141,8 @@ ru: unprocessable_entity: title: "Требуемое изменение было отклонено (422)" message_html: "

Требуемое изменение было отклонено. Возможно, вы пытались изменить что-то, к чему у вас нет доступа.

Вернуться домой

" - stimulus_reflex_error: "Нам очень жаль, но что-то пошло не так.\n\n Возможно, это временная проблема, поэтому повторите попытку или перезагрузите страницу.\n Мы записываем все ошибки и возможно уже работаем над их исправлением.\n Если проблема не устранена или срочная, пожалуйста, свяжитесь с нами." + general_error: + message: "Нам очень жаль, но что-то пошло не так.\n\n Возможно, это временная проблема, поэтому повторите попытку или перезагрузите страницу.\n Мы записываем все ошибки и возможно уже работаем над их исправлением.\n Если проблема не устранена или срочная, пожалуйста, свяжитесь с нами." stripe: error_code: incorrect_number: "Номер карты неверный." @@ -542,6 +543,7 @@ ru: edit: Изменить clone: Клонировать delete: Удалить + remove: Удалить image: edit: Изменить adjustments: @@ -767,6 +769,7 @@ ru: index: header: title: Массовое редактирование товаров + content: loading: Загрузка ваших товаров delete_modal: delete_product_modal: @@ -819,16 +822,18 @@ ru: new_variant: Новый вариант bulk_update: success: Изменения сохранены - edit_image: - title: Изменить фотографию товара - close: Назад - upload: Загрузить фото delete_product: success: Товар успешно удален error: Невозможно удалить товар delete_variant: success: Вариант успешно удален. error: Невозможно удалить вариант + variant_row: + none_tax_category: Нет + category_field_name: "Категория" + tax_category_field_name: "Налоговая Категория" + product_row: + producer_field_name: "Производитель" product_import: title: Импорт Товара file_not_found: Файл не найден или не может быть открыт @@ -2073,7 +2078,6 @@ ru: label_account: "Профиль" label_more: "Показать больше" label_less: "Показать меньше" - label_notices: "Уведомления" cart_items: "позиции" cart_headline: "Ваша корзина" total: "Всего" @@ -4004,6 +4008,11 @@ ru: validation: must_be_int: "должно быть целым числом" admin: + images: + edit: + title: Изменить фотографию товара + close: Назад + upload: Загрузить фото mail_methods: send_testmail: "Отправить тестовое письмо" testmail: @@ -4031,6 +4040,10 @@ ru: customers: "Клиенты" groups: "Группы" oidc_settings: "Настройки OIDC" + overview: "Введение" + product_import: "Импорт" + enterprise_roles: "Роли" + payment_methods: "Способы Оплаты" product_properties: index: inherits_properties_checkbox_hint: "Наследовать свойства от %{supplier}? (если не отменено выше)" diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 78f53f39ab9..881e1d637c3 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -176,6 +176,7 @@ sv: inherits_properties: "Ärva egenskaper?" actions: edit: Redigera + remove: Ta bort image: edit: Redigera customer: Kund @@ -325,8 +326,12 @@ sv: producers: label: 'Producenter ' search: Sök - edit_image: - close: Backa + variant_row: + none_tax_category: Ingen + category_field_name: "Kategori" + tax_category_field_name: "Skattekategori" + product_row: + producer_field_name: "Producent" product_import: file_not_found: Filen hittades inte eller kunde inte öppnas no_data: Ingen data hittades i kalkylbladet @@ -984,7 +989,6 @@ sv: label_account: "Konto" label_more: "Visa mer" label_less: "Visa mindre" - label_notices: "Anmälan" cart_headline: "Din varukorg" total: "Summa " cart_updating: "Uppdatera din varukorg" @@ -2193,6 +2197,9 @@ sv: messages: blank: "kan inte vara blank" admin: + images: + edit: + close: Backa tab: dashboard: "Panel" bulk_order_management: "Hantera flera beställningar" @@ -2206,6 +2213,9 @@ sv: enterprises: "Företag" customers: "Kunder" groups: "Grupper" + overview: "Översikt" + enterprise_roles: "Uppgifter" + payment_methods: "Betalningssätt" properties: index: properties: "Egenskaper" diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 121265018a8..4d58cb5e1ac 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -386,6 +386,7 @@ tr: edit: Düzenle clone: Kopyala delete: Sil + remove: Kaldır image: edit: Düzenle adjustments: @@ -610,8 +611,12 @@ tr: clear_search: Aramayı temizle table: new_variant: Yeni Çeşit - edit_image: - close: Geri + variant_row: + none_tax_category: SATIŞ YAPMIYOR + category_field_name: "Kategori" + tax_category_field_name: "Vergi Kategorisi" + product_row: + producer_field_name: "ÜRETİCİ" product_import: title: Ürün Aktarımı file_not_found: Dosya bulunamadı veya açılamadı @@ -1663,7 +1668,6 @@ tr: label_account: "Hesap" label_more: "Daha fazla göster" label_less: "Daha az göster" - label_notices: "Uyarılar" cart_items: "Ürünler" cart_headline: "Alışveriş sepetiniz" total: "Toplam" @@ -3453,6 +3457,9 @@ tr: validation: must_be_int: "tam sayı olmak zorunda" admin: + images: + edit: + close: Geri mail_methods: send_testmail: "Deneme e-postası gönder" testmail: @@ -3479,6 +3486,10 @@ tr: enterprise_relationships: "İZİNLER" customers: "MÜŞTERİLER" groups: "AĞLAR" + overview: "genel bakış" + product_import: "Aktar" + enterprise_roles: "Roller" + payment_methods: "ÖDEME YÖNTEMLERİ" product_properties: index: inherits_properties_checkbox_hint: "Özellikler %{supplier}'den devralınsın mı? (yukarıda geçersiz kılınmadıkça)" diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 210e77f1345..bb439ae6dec 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -468,6 +468,7 @@ uk: edit: Редагувати clone: Клонувати delete: Видалити + remove: Видалити image: edit: Редагувати adjustments: @@ -695,8 +696,12 @@ uk: clear_search: Очистити пошук table: new_variant: Новий варіант - edit_image: - close: Назад + variant_row: + none_tax_category: Жодного + category_field_name: "Категорія" + tax_category_field_name: "Категорія податку" + product_row: + producer_field_name: "Виробник" product_import: title: Імпорт продукту file_not_found: Файл не знайдено або не вдалося відкрити @@ -1816,7 +1821,6 @@ uk: label_account: "Обліковий запис" label_more: "Показати більше" label_less: "Показувати менше" - label_notices: "Повідомлення" cart_items: "Товари" cart_headline: "Ваш кошик для покупок" total: "Всього" @@ -3679,6 +3683,9 @@ uk: validation: must_be_int: "має бути цілим числом" admin: + images: + edit: + close: Назад mail_methods: send_testmail: "Надіслати тестовий електронний лист" testmail: @@ -3705,6 +3712,10 @@ uk: enterprise_relationships: "Дозволи" customers: "Клієнти" groups: "Групи" + overview: "Огляд" + product_import: "Імпорт" + enterprise_roles: "Ролі" + payment_methods: "Методи оплати" product_properties: index: inherits_properties_checkbox_hint: "Успадкувати властивості від %{supplier}? (якщо не перевизначено вище)" diff --git a/config/routes.rb b/config/routes.rb index ba182c96076..7537dd46155 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,9 +11,6 @@ get "/login", to: redirect("/#/login") get '/unauthorized', :to => 'home#unauthorized', :as => :unauthorized - get "/discourse/login", to: "discourse_sso#login" - get "/discourse/sso", to: "discourse_sso#sso" - get "/map", to: "map#index", as: :map get "/sell", to: "home#sell", as: :sell diff --git a/config/routes/admin.rb b/config/routes/admin.rb index 1a7ca8c3ccf..4016f8a695b 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -35,6 +35,8 @@ patch :register end + resources :connected_apps, only: [:create, :destroy] + resources :producer_properties do post :update_positions, on: :collection end @@ -73,6 +75,9 @@ # This might be easier to arrange once we rename the controller to plain old "products" post '/products/bulk_update', to: 'products_v3#bulk_update' get '/products', to: 'products_v3#index' + # we already have DELETE admin/products/:id here + delete 'products_v3/:id', to: 'products_v3#destroy', as: 'product_destroy' + delete 'products_v3/destroy_variant/:id', to: 'products_v3#destroy_variant', as: 'destroy_variant' end resources :variant_overrides do @@ -90,7 +95,7 @@ resource :contents - resources :column_preferences, only: [], format: :json do + resources :column_preferences, only: [] do put :bulk_update, on: :collection end diff --git a/db/migrate/20240222192158_change_flipper_gates_value_to_text.rb b/db/migrate/20240222192158_change_flipper_gates_value_to_text.rb new file mode 100644 index 00000000000..67fabe7d4ef --- /dev/null +++ b/db/migrate/20240222192158_change_flipper_gates_value_to_text.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class ChangeFlipperGatesValueToText < ActiveRecord::Migration[7.0] + def up + # Ensure this incremental update migration is idempotent + return unless connection.column_exists? :flipper_gates, :value, :string + + if index_exists? :flipper_gates, [:feature_key, :key, :value] + remove_index :flipper_gates, [:feature_key, :key, :value] + end + change_column :flipper_gates, :value, :text + add_index :flipper_gates, [:feature_key, :key, :value], unique: true, length: { value: 255 } + end + + def down + change_column :flipper_gates, :value, :string + end +end diff --git a/db/migrate/20240422140057_require_order_cycle_and_sender_and_receiver_on_exchange.rb b/db/migrate/20240422140057_require_order_cycle_and_sender_and_receiver_on_exchange.rb new file mode 100644 index 00000000000..b159516a3a8 --- /dev/null +++ b/db/migrate/20240422140057_require_order_cycle_and_sender_and_receiver_on_exchange.rb @@ -0,0 +1,7 @@ +class RequireOrderCycleAndSenderAndReceiverOnExchange < ActiveRecord::Migration[7.0] + def change + change_column_null :exchanges, :order_cycle_id, false + change_column_null :exchanges, :sender_id, false + change_column_null :exchanges, :receiver_id, false + end +end diff --git a/db/migrate/20240422145353_require_name_and_coordinator_on_order_cycle.rb b/db/migrate/20240422145353_require_name_and_coordinator_on_order_cycle.rb new file mode 100644 index 00000000000..a58db5462d3 --- /dev/null +++ b/db/migrate/20240422145353_require_name_and_coordinator_on_order_cycle.rb @@ -0,0 +1,6 @@ +class RequireNameAndCoordinatorOnOrderCycle < ActiveRecord::Migration[7.0] + def change + change_column_null :order_cycles, :name, false + change_column_null :order_cycles, :coordinator_id, false + end +end diff --git a/db/migrate/20240422150502_require_address1_and_city_and_phone_and_country_and_on_address.rb b/db/migrate/20240422150502_require_address1_and_city_and_phone_and_country_and_on_address.rb new file mode 100644 index 00000000000..f200225349e --- /dev/null +++ b/db/migrate/20240422150502_require_address1_and_city_and_phone_and_country_and_on_address.rb @@ -0,0 +1,8 @@ +class RequireAddress1AndCityAndPhoneAndCountryAndOnAddress < ActiveRecord::Migration[7.0] + def change + change_column_null :spree_addresses, :address1, false + change_column_null :spree_addresses, :city, false + change_column_null :spree_addresses, :phone, false + change_column_null :spree_addresses, :country_id, false + end +end diff --git a/db/migrate/20240424075646_require_property_on_product_property.rb b/db/migrate/20240424075646_require_property_on_product_property.rb new file mode 100644 index 00000000000..d8f8502e127 --- /dev/null +++ b/db/migrate/20240424075646_require_property_on_product_property.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class RequirePropertyOnProductProperty < ActiveRecord::Migration[7.0] + def change + change_column_null :spree_product_properties, :property_id, false + end +end diff --git a/db/migrate/20240424113354_require_order_on_return_authorization.rb b/db/migrate/20240424113354_require_order_on_return_authorization.rb new file mode 100644 index 00000000000..13aaea40aac --- /dev/null +++ b/db/migrate/20240424113354_require_order_on_return_authorization.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class RequireOrderOnReturnAuthorization < ActiveRecord::Migration[7.0] + def change + change_column_null :spree_return_authorizations, :order_id, false + end +end diff --git a/db/migrate/20240424121221_require_country_on_state.rb b/db/migrate/20240424121221_require_country_on_state.rb new file mode 100644 index 00000000000..b2862c4898e --- /dev/null +++ b/db/migrate/20240424121221_require_country_on_state.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class RequireCountryOnState < ActiveRecord::Migration[7.0] + def change + change_column_null :spree_states, :country_id, false + end +end diff --git a/db/migrate/20240430075133_require_product_on_product_property.rb b/db/migrate/20240430075133_require_product_on_product_property.rb new file mode 100644 index 00000000000..4dd309ce0ac --- /dev/null +++ b/db/migrate/20240430075133_require_product_on_product_property.rb @@ -0,0 +1,5 @@ +class RequireProductOnProductProperty < ActiveRecord::Migration[7.0] + def change + change_column_null :spree_product_properties, :product_id, false + end +end diff --git a/db/migrate/20240501072547_require_variant_and_stock_location_on_stock_item.rb b/db/migrate/20240501072547_require_variant_and_stock_location_on_stock_item.rb new file mode 100644 index 00000000000..c68cd74d0db --- /dev/null +++ b/db/migrate/20240501072547_require_variant_and_stock_location_on_stock_item.rb @@ -0,0 +1,6 @@ +class RequireVariantAndStockLocationOnStockItem < ActiveRecord::Migration[7.0] + def change + change_column_null :spree_stock_items, :stock_location_id, false + change_column_null :spree_stock_items, :variant_id, false + end +end diff --git a/db/migrate/20240501075735_require_stock_item_and_quantity_on_stock_movement.rb b/db/migrate/20240501075735_require_stock_item_and_quantity_on_stock_movement.rb new file mode 100644 index 00000000000..52d21d7f6da --- /dev/null +++ b/db/migrate/20240501075735_require_stock_item_and_quantity_on_stock_movement.rb @@ -0,0 +1,6 @@ +class RequireStockItemAndQuantityOnStockMovement < ActiveRecord::Migration[7.0] + def change + change_column_null :spree_stock_movements, :stock_item_id, false + change_column_null :spree_stock_movements, :quantity, false + end +end diff --git a/db/migrate/20240502035220_update_n8n_url.rb b/db/migrate/20240502035220_update_n8n_url.rb new file mode 100644 index 00000000000..df2aaf16e7b --- /dev/null +++ b/db/migrate/20240502035220_update_n8n_url.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +# We got a new n8n server. +# But we still have some database rows with a URL to the old server. +class UpdateN8nUrl < ActiveRecord::Migration[7.0] + def up + execute <<~SQL.squish + UPDATE connected_apps + SET data = replace( + data::text, + 'n8n.openfoodnetwork.org.uk', + 'n8n.openfoodnetwork.org' + )::jsonb + WHERE data IS NOT NULL; + SQL + end +end diff --git a/db/migrate/20240510040639_remove_distributor_info_from_enterprises.rb b/db/migrate/20240510040639_remove_distributor_info_from_enterprises.rb new file mode 100644 index 00000000000..3ead73c8a76 --- /dev/null +++ b/db/migrate/20240510040639_remove_distributor_info_from_enterprises.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class RemoveDistributorInfoFromEnterprises < ActiveRecord::Migration[7.0] + def change + remove_column :enterprises, :distributor_info, :text + end +end diff --git a/db/migrate/20240510041114_remove_pickup_times_from_enterprises.rb b/db/migrate/20240510041114_remove_pickup_times_from_enterprises.rb new file mode 100644 index 00000000000..bfe62525a6e --- /dev/null +++ b/db/migrate/20240510041114_remove_pickup_times_from_enterprises.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class RemovePickupTimesFromEnterprises < ActiveRecord::Migration[7.0] + def change + remove_column :enterprises, :pickup_times, :text + end +end diff --git a/db/migrate/20240510041829_remove_next_collection_at_from_enterprises.rb b/db/migrate/20240510041829_remove_next_collection_at_from_enterprises.rb new file mode 100644 index 00000000000..bce671833f3 --- /dev/null +++ b/db/migrate/20240510041829_remove_next_collection_at_from_enterprises.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class RemoveNextCollectionAtFromEnterprises < ActiveRecord::Migration[7.0] + def change + remove_column :enterprises, :next_collection_at, :string + end +end diff --git a/db/migrate/20240517121235_require_tax_category_on_tax_rate.rb b/db/migrate/20240517121235_require_tax_category_on_tax_rate.rb new file mode 100644 index 00000000000..4bc80ca713a --- /dev/null +++ b/db/migrate/20240517121235_require_tax_category_on_tax_rate.rb @@ -0,0 +1,5 @@ +class RequireTaxCategoryOnTaxRate < ActiveRecord::Migration[7.0] + def change + change_column_null :spree_tax_rates, :tax_category_id, false + end +end diff --git a/db/migrate/20240529081209_require_order_and_variant_on_line_item.rb b/db/migrate/20240529081209_require_order_and_variant_on_line_item.rb new file mode 100644 index 00000000000..8d2920147ae --- /dev/null +++ b/db/migrate/20240529081209_require_order_and_variant_on_line_item.rb @@ -0,0 +1,6 @@ +class RequireOrderAndVariantOnLineItem < ActiveRecord::Migration[7.0] + def change + change_column_null :spree_line_items, :order_id, false + change_column_null :spree_line_items, :variant_id, false + end +end diff --git a/db/schema.rb b/db/schema.rb index 51491dce7fe..70feb4b8e7e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2024_02_13_044159) do +ActiveRecord::Schema[7.0].define(version: 2024_05_29_081209) do # These are extensions that must be enabled in order to support this database enable_extension "pg_stat_statements" enable_extension "plpgsql" @@ -204,11 +204,8 @@ t.string "abn", limit: 255 t.string "acn", limit: 255 t.integer "address_id" - t.text "pickup_times" - t.string "next_collection_at", limit: 255 t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false - t.text "distributor_info" t.string "facebook", limit: 255 t.string "instagram", limit: 255 t.string "linkedin", limit: 255 @@ -258,9 +255,9 @@ end create_table "exchanges", id: :serial, force: :cascade do |t| - t.integer "order_cycle_id" - t.integer "sender_id" - t.integer "receiver_id" + t.integer "order_cycle_id", null: false + t.integer "sender_id", null: false + t.integer "receiver_id", null: false t.text "pickup_time" t.text "pickup_instructions" t.datetime "created_at", precision: nil, null: false @@ -282,7 +279,7 @@ create_table "flipper_gates", id: :serial, force: :cascade do |t| t.string "feature_key", null: false t.string "key", null: false - t.string "value" + t.text "value" t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false t.index ["feature_key", "key", "value"], name: "index_flipper_gates_on_feature_key_and_key_and_value", unique: true @@ -330,10 +327,10 @@ end create_table "order_cycles", id: :serial, force: :cascade do |t| - t.string "name", limit: 255 + t.string "name", limit: 255, null: false t.datetime "orders_open_at", precision: nil t.datetime "orders_close_at", precision: nil - t.integer "coordinator_id" + t.integer "coordinator_id", null: false t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false t.datetime "processed_at", precision: nil @@ -420,15 +417,15 @@ create_table "spree_addresses", id: :serial, force: :cascade do |t| t.string "firstname", limit: 255 t.string "lastname", limit: 255 - t.string "address1", limit: 255 + t.string "address1", limit: 255, null: false t.string "address2", limit: 255 - t.string "city", limit: 255 + t.string "city", limit: 255, null: false t.string "zipcode", limit: 255 - t.string "phone", limit: 255 + t.string "phone", limit: 255, null: false t.string "state_name", limit: 255 t.string "alternative_phone", limit: 255 t.integer "state_id" - t.integer "country_id" + t.integer "country_id", null: false t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false t.string "company", limit: 255 @@ -544,8 +541,8 @@ end create_table "spree_line_items", id: :serial, force: :cascade do |t| - t.integer "order_id" - t.integer "variant_id" + t.integer "order_id", null: false + t.integer "variant_id", null: false t.integer "quantity", null: false t.decimal "price", precision: 10, scale: 2, null: false t.datetime "created_at", precision: nil, null: false @@ -674,8 +671,8 @@ create_table "spree_product_properties", id: :serial, force: :cascade do |t| t.string "value", limit: 255 - t.integer "product_id" - t.integer "property_id" + t.integer "product_id", null: false + t.integer "property_id", null: false t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false t.integer "position", default: 0 @@ -718,7 +715,7 @@ t.string "number", limit: 255 t.string "state", limit: 255 t.decimal "amount", precision: 10, scale: 2, default: "0.0", null: false - t.integer "order_id" + t.integer "order_id", null: false t.text "reason" t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false @@ -814,12 +811,12 @@ create_table "spree_states", id: :serial, force: :cascade do |t| t.string "name", limit: 255 t.string "abbr", limit: 255 - t.integer "country_id" + t.integer "country_id", null: false end create_table "spree_stock_items", id: :serial, force: :cascade do |t| - t.integer "stock_location_id" - t.integer "variant_id" + t.integer "stock_location_id", null: false + t.integer "variant_id", null: false t.integer "count_on_hand", default: 0, null: false t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false @@ -849,8 +846,8 @@ end create_table "spree_stock_movements", id: :serial, force: :cascade do |t| - t.integer "stock_item_id" - t.integer "quantity", default: 0 + t.integer "stock_item_id", null: false + t.integer "quantity", default: 0, null: false t.string "action", limit: 255 t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false @@ -871,7 +868,7 @@ create_table "spree_tax_rates", id: :serial, force: :cascade do |t| t.decimal "amount", precision: 8, scale: 5 t.integer "zone_id" - t.integer "tax_category_id" + t.integer "tax_category_id", null: false t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false t.boolean "included_in_price", default: false diff --git a/engines/catalog/spec/services/catalog/product_import/products_reset_strategy_spec.rb b/engines/catalog/spec/services/catalog/product_import/products_reset_strategy_spec.rb index 823ed5d6b15..c6d43be45f3 100644 --- a/engines/catalog/spec/services/catalog/product_import/products_reset_strategy_spec.rb +++ b/engines/catalog/spec/services/catalog/product_import/products_reset_strategy_spec.rb @@ -4,7 +4,7 @@ module Catalog module ProductImport - describe ProductsResetStrategy do + RSpec.describe ProductsResetStrategy do let(:products_reset) { described_class.new(excluded_items_ids) } describe '#reset' do diff --git a/engines/dfc_provider/app/services/dfc_request.rb b/engines/dfc_provider/app/services/dfc_request.rb index 8de0108d99f..949ec23bad7 100644 --- a/engines/dfc_provider/app/services/dfc_request.rb +++ b/engines/dfc_provider/app/services/dfc_request.rb @@ -13,33 +13,41 @@ def initialize(user) @user = user end - def get(url) - response = request(url) + def call(url, data = nil) + response = request(url, data) - return response.body if response.status == 200 - - return "" if @user.oidc_account.updated_at > 15.minutes.ago - - refresh_access_token! + if response.status >= 400 && token_stale? + refresh_access_token! + response = request(url, data) + end - response = request(url) response.body end private - def request(url) - connection = Faraday.new( + def request(url, data = nil) + only_public_connections do + if data + connection.post(url, data) + else + connection.get(url) + end + end + end + + def token_stale? + @user.oidc_account.updated_at < 15.minutes.ago + end + + def connection + Faraday.new( request: { timeout: 30 }, headers: { 'Content-Type' => 'application/json', 'Authorization' => "Bearer #{@user.oidc_account.token}", } ) - - only_public_connections do - connection.get(url) - end end def only_public_connections(&) diff --git a/engines/dfc_provider/app/services/enterprise_builder.rb b/engines/dfc_provider/app/services/enterprise_builder.rb index b2087c2601d..f29f79fca91 100644 --- a/engines/dfc_provider/app/services/enterprise_builder.rb +++ b/engines/dfc_provider/app/services/enterprise_builder.rb @@ -21,7 +21,9 @@ def self.enterprise(enterprise) # rubocop:disable Metrics/AbcSize localizations: [address], phoneNumbers: [enterprise.phone].compact, socialMedias: SocialMediaBuilder.social_medias(enterprise), - websites: [enterprise.website].compact, + + # The model strips the protocol and we need to add it: + websites: [enterprise.website].compact_blank.map { |url| "https://#{url}" }, ).tap do |e| add_ofn_property(e, "ofn:long_description", enterprise.long_description) diff --git a/engines/dfc_provider/app/services/fdc_request.rb b/engines/dfc_provider/app/services/fdc_request.rb new file mode 100644 index 00000000000..5252cff85af --- /dev/null +++ b/engines/dfc_provider/app/services/fdc_request.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require "private_address_check" +require "private_address_check/tcpsocket_ext" + +# Request a JSON document from the FDC API with authentication. +# +# Currently, the API doesn't quite comply with the DFC standard and we need +# to authenticate a little bit differently. +# +# And then we get slightly different data as well. +class FdcRequest < DfcRequest + # Override main method to POST authorization data. + def call(url, data = {}) + response = request(url, auth_data.merge(data).to_json) + + if response.status >= 400 && token_stale? + refresh_access_token! + response = request(url, auth_data.merge(data).to_json) + end + + response.body + end + + private + + def auth_data + { + userId: @user.oidc_account.uid, + accessToken: @user.oidc_account.token, + } + end +end diff --git a/engines/dfc_provider/app/services/quantitative_value_builder.rb b/engines/dfc_provider/app/services/quantitative_value_builder.rb index 37794631153..6baac1eecf9 100644 --- a/engines/dfc_provider/app/services/quantitative_value_builder.rb +++ b/engines/dfc_provider/app/services/quantitative_value_builder.rb @@ -33,7 +33,7 @@ def self.apply(quantity, product) product.variant_unit = measure product.variant_unit_name = unit_name if measure == "items" product.variant_unit_scale = unit_scale - product.unit_value = quantity.value * unit_scale + product.unit_value = quantity.value.to_f * unit_scale end # Map DFC units to OFN fields: diff --git a/engines/dfc_provider/spec/requests/addresses_spec.rb b/engines/dfc_provider/spec/requests/addresses_spec.rb index 21032e5df9f..9e8693b03c3 100644 --- a/engines/dfc_provider/spec/requests/addresses_spec.rb +++ b/engines/dfc_provider/spec/requests/addresses_spec.rb @@ -2,7 +2,7 @@ require_relative "../swagger_helper" -describe "Addresses", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do +RSpec.describe "Addresses", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do let(:user) { create(:oidc_user) } let(:address) { create(:address, id: 40_000) } let(:result) { json_response } diff --git a/engines/dfc_provider/spec/requests/catalog_items_spec.rb b/engines/dfc_provider/spec/requests/catalog_items_spec.rb index f047812e005..1405a5b0a5b 100644 --- a/engines/dfc_provider/spec/requests/catalog_items_spec.rb +++ b/engines/dfc_provider/spec/requests/catalog_items_spec.rb @@ -2,8 +2,8 @@ require_relative "../swagger_helper" -describe "CatalogItems", type: :request, swagger_doc: "dfc.yaml", - rswag_autodoc: true do +RSpec.describe "CatalogItems", type: :request, swagger_doc: "dfc.yaml", + rswag_autodoc: true do let(:user) { create(:oidc_user, id: 12_345) } let(:enterprise) { create( diff --git a/engines/dfc_provider/spec/requests/enterprise_groups/affiliated_by_spec.rb b/engines/dfc_provider/spec/requests/enterprise_groups/affiliated_by_spec.rb index 4230fe2b29d..fdee727fa81 100644 --- a/engines/dfc_provider/spec/requests/enterprise_groups/affiliated_by_spec.rb +++ b/engines/dfc_provider/spec/requests/enterprise_groups/affiliated_by_spec.rb @@ -2,8 +2,8 @@ require_relative "../../swagger_helper" -describe "EnterpriseGroups::AffiliatedBy", type: :request, swagger_doc: "dfc.yaml", - rswag_autodoc: true do +RSpec.describe "EnterpriseGroups::AffiliatedBy", type: :request, swagger_doc: "dfc.yaml", + rswag_autodoc: true do let(:user) { create(:oidc_user, id: 12_345) } let(:group) { create( diff --git a/engines/dfc_provider/spec/requests/enterprise_groups_spec.rb b/engines/dfc_provider/spec/requests/enterprise_groups_spec.rb index 80f734d92e7..8b3f1618935 100644 --- a/engines/dfc_provider/spec/requests/enterprise_groups_spec.rb +++ b/engines/dfc_provider/spec/requests/enterprise_groups_spec.rb @@ -2,7 +2,7 @@ require_relative "../swagger_helper" -describe "EnterpriseGroups", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do +RSpec.describe "EnterpriseGroups", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do let(:user) { create(:oidc_user, id: 12_345) } let(:group) { create( diff --git a/engines/dfc_provider/spec/requests/enterprises_spec.rb b/engines/dfc_provider/spec/requests/enterprises_spec.rb index 587971a2ec2..9785361aa67 100644 --- a/engines/dfc_provider/spec/requests/enterprises_spec.rb +++ b/engines/dfc_provider/spec/requests/enterprises_spec.rb @@ -2,7 +2,7 @@ require_relative "../swagger_helper" -describe "Enterprises", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do +RSpec.describe "Enterprises", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do let!(:user) { create(:oidc_user) } let!(:enterprise) do create( @@ -71,6 +71,7 @@ expect(json_response["@graph"][0]).to include( "dfc-b:affiliates" => "http://test.host/api/dfc/enterprise_groups/60000", + "dfc-b:websitePage" => "https://openfoodnetwork.org", ) # Insert static value to keep documentation deterministic: diff --git a/engines/dfc_provider/spec/requests/offers_spec.rb b/engines/dfc_provider/spec/requests/offers_spec.rb index 826df7be766..f309613c0c2 100644 --- a/engines/dfc_provider/spec/requests/offers_spec.rb +++ b/engines/dfc_provider/spec/requests/offers_spec.rb @@ -2,7 +2,7 @@ require_relative "../swagger_helper" -describe "Offers", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do +RSpec.describe "Offers", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do let!(:user) { create(:oidc_user) } let!(:enterprise) { create(:distributor_enterprise, id: 10_000, owner: user) } let!(:product) { diff --git a/engines/dfc_provider/spec/requests/persons_spec.rb b/engines/dfc_provider/spec/requests/persons_spec.rb index 3af17b76e9d..a7ef52c0c49 100644 --- a/engines/dfc_provider/spec/requests/persons_spec.rb +++ b/engines/dfc_provider/spec/requests/persons_spec.rb @@ -2,7 +2,7 @@ require_relative "../swagger_helper" -describe "Persons", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do +RSpec.describe "Persons", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do let(:user) { create(:oidc_user, id: 10_000) } let(:other_user) { create(:oidc_user) } diff --git a/engines/dfc_provider/spec/requests/social_medias_spec.rb b/engines/dfc_provider/spec/requests/social_medias_spec.rb index 4211e5f4557..71e7bfdbee9 100644 --- a/engines/dfc_provider/spec/requests/social_medias_spec.rb +++ b/engines/dfc_provider/spec/requests/social_medias_spec.rb @@ -2,7 +2,7 @@ require_relative "../swagger_helper" -describe "SocialMedias", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do +RSpec.describe "SocialMedias", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do let(:user) { create(:oidc_user) } let(:enterprise) do create( diff --git a/engines/dfc_provider/spec/requests/supplied_products_spec.rb b/engines/dfc_provider/spec/requests/supplied_products_spec.rb index d57d45c0f02..e72e13017f0 100644 --- a/engines/dfc_provider/spec/requests/supplied_products_spec.rb +++ b/engines/dfc_provider/spec/requests/supplied_products_spec.rb @@ -2,7 +2,7 @@ require_relative "../swagger_helper" -describe "SuppliedProducts", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do +RSpec.describe "SuppliedProducts", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true do let!(:user) { create(:oidc_user) } let!(:enterprise) { create(:distributor_enterprise, id: 10_000, owner: user) } let!(:product) { diff --git a/engines/dfc_provider/spec/services/address_builder_spec.rb b/engines/dfc_provider/spec/services/address_builder_spec.rb index 134e08e998c..89020de3e78 100644 --- a/engines/dfc_provider/spec/services/address_builder_spec.rb +++ b/engines/dfc_provider/spec/services/address_builder_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe AddressBuilder do +RSpec.describe AddressBuilder do subject(:result) { described_class.address(address) } let(:address) { build( diff --git a/engines/dfc_provider/spec/services/authorization_control_spec.rb b/engines/dfc_provider/spec/services/authorization_control_spec.rb index 97cd646df3d..f5695f0cd6b 100644 --- a/engines/dfc_provider/spec/services/authorization_control_spec.rb +++ b/engines/dfc_provider/spec/services/authorization_control_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe AuthorizationControl do +RSpec.describe AuthorizationControl do include AuthorizationHelper let(:user) { create(:oidc_user) } diff --git a/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb b/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb index ed80ac34a17..7c1b4d2c0f2 100644 --- a/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb +++ b/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe DfcBuilder do +RSpec.describe DfcBuilder do let(:variant) { build(:variant) } describe ".catalog_item" do diff --git a/engines/dfc_provider/spec/services/dfc_io_spec.rb b/engines/dfc_provider/spec/services/dfc_io_spec.rb index e95801853ca..58194ce2041 100644 --- a/engines/dfc_provider/spec/services/dfc_io_spec.rb +++ b/engines/dfc_provider/spec/services/dfc_io_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe DfcIo do +RSpec.describe DfcIo do let(:person) do DataFoodConsortium::Connector::Person.new("Pete") end diff --git a/engines/dfc_provider/spec/services/dfc_loader_spec.rb b/engines/dfc_provider/spec/services/dfc_loader_spec.rb index c36f05f75f8..93ae98de9df 100644 --- a/engines/dfc_provider/spec/services/dfc_loader_spec.rb +++ b/engines/dfc_provider/spec/services/dfc_loader_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe DfcLoader do +RSpec.describe DfcLoader do it "prepares the DFC Connector to provide DFC object classes for export" do tomato = DataFoodConsortium::Connector::SuppliedProduct.new( "https://openfoodnetwork.org/tomato", diff --git a/engines/dfc_provider/spec/services/dfc_product_type_factory_spec.rb b/engines/dfc_provider/spec/services/dfc_product_type_factory_spec.rb index be4fa4342b5..191046c2940 100644 --- a/engines/dfc_provider/spec/services/dfc_product_type_factory_spec.rb +++ b/engines/dfc_provider/spec/services/dfc_product_type_factory_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe DfcProductTypeFactory do +RSpec.describe DfcProductTypeFactory do describe ".for" do let(:dfc_id) { "https://github.com/datafoodconsortium/taxonomies/releases/latest/download/productTypes.rdf#drink" diff --git a/engines/dfc_provider/spec/services/dfc_request_spec.rb b/engines/dfc_provider/spec/services/dfc_request_spec.rb index a4f0421fadc..ea17ae02afb 100644 --- a/engines/dfc_provider/spec/services/dfc_request_spec.rb +++ b/engines/dfc_provider/spec/services/dfc_request_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe DfcRequest do +RSpec.describe DfcRequest do subject(:api) { DfcRequest.new(user) } let(:user) { build(:oidc_user) } @@ -12,7 +12,16 @@ stub_request(:get, "http://example.net/api"). to_return(status: 200, body: '{"@context":"/"}') - expect(api.get("http://example.net/api")).to eq '{"@context":"/"}' + expect(api.call("http://example.net/api")).to eq '{"@context":"/"}' + end + + it "posts a DFC document" do + json = '{"name":"new season apples"}' + stub_request(:post, "http://example.net/api"). + with(body: json). + to_return(status: 201) # Created + + expect(api.call("http://example.net/api", json)).to eq "" end it "refreshes the access token on fail", vcr: true do @@ -30,7 +39,7 @@ account.updated_at = 1.day.ago expect { - api.get("http://example.net/api") + api.call("http://example.net/api") }.to change { account.token }.and change { @@ -44,7 +53,7 @@ user.oidc_account.updated_at = 1.minute.ago - expect(api.get("http://example.net/api")).to eq "" + expect(api.call("http://example.net/api")).to eq "" # Trying to reach the OIDC server via network request to refresh the token # would raise errors because we didn't setup Webmock or VCR. diff --git a/engines/dfc_provider/spec/services/enterprise_builder_spec.rb b/engines/dfc_provider/spec/services/enterprise_builder_spec.rb index 8e24ed4fd1d..cc26fe767bc 100644 --- a/engines/dfc_provider/spec/services/enterprise_builder_spec.rb +++ b/engines/dfc_provider/spec/services/enterprise_builder_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe EnterpriseBuilder do +RSpec.describe EnterpriseBuilder do subject(:builder) { described_class } let(:enterprise) { build( diff --git a/engines/dfc_provider/spec/services/fdc_request_spec.rb b/engines/dfc_provider/spec/services/fdc_request_spec.rb new file mode 100644 index 00000000000..c1f59d40f8d --- /dev/null +++ b/engines/dfc_provider/spec/services/fdc_request_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require_relative "../spec_helper" + +RSpec.describe FdcRequest do + subject(:api) { FdcRequest.new(user) } + + let(:user) { build(:oidc_user) } + let(:account) { user.oidc_account } + let(:url) { + "https://food-data-collaboration-produc-fe870152f634.herokuapp.com/fdc/products?shop=test-hodmedod.myshopify.com" + } + + it "refreshes the access token and retrieves a catalog", vcr: true do + # A refresh is only attempted if the token is stale. + account.uid = "testdfc@protonmail.com" + account.refresh_token = ENV.fetch("OPENID_REFRESH_TOKEN") + account.updated_at = 1.day.ago + + response = nil + expect { + response = api.call(url) + }.to change { + account.token + }.and change { + account.refresh_token + } + + json = JSON.parse(response) + expect(json["message"]).to eq "Products retrieved successfully" + + graph = DfcIo.import(json["products"]) + products = graph.select { |s| s.semanticType == "dfc-b:SuppliedProduct" } + expect(products).to be_present + end +end diff --git a/engines/dfc_provider/spec/services/offer_builder_spec.rb b/engines/dfc_provider/spec/services/offer_builder_spec.rb index 15ef9c4ddaa..0fd9732d474 100644 --- a/engines/dfc_provider/spec/services/offer_builder_spec.rb +++ b/engines/dfc_provider/spec/services/offer_builder_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe OfferBuilder do +RSpec.describe OfferBuilder do let(:variant) { build(:variant) } describe ".offer" do diff --git a/engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb b/engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb index 39f2a8d8a77..f18a58b5611 100644 --- a/engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb +++ b/engines/dfc_provider/spec/services/quantitative_value_builder_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe QuantitativeValueBuilder do +RSpec.describe QuantitativeValueBuilder do subject(:builder) { described_class } let(:variant) { build(:variant, product:) } let(:product) { build(:product, name: "Apple") } @@ -104,6 +104,20 @@ expect(product.unit_value).to eq 0.005 end + it "interpretes values given as a string" do + quantity = DataFoodConsortium::Connector::QuantitativeValue.new( + unit: quantity_unit.KILOGRAM, + value: "0.4", + ) + + builder.apply(quantity, product) + + expect(product.variant_unit).to eq "weight" + expect(product.variant_unit_name).to eq nil + expect(product.variant_unit_scale).to eq 1_000 + expect(product.unit_value).to eq 400 + end + it "knows imperial units" do quantity = DataFoodConsortium::Connector::QuantitativeValue.new( unit: quantity_unit.POUNDMASS, diff --git a/engines/dfc_provider/spec/services/social_media_builder_spec.rb b/engines/dfc_provider/spec/services/social_media_builder_spec.rb index 633ce732d84..85d440d0e05 100644 --- a/engines/dfc_provider/spec/services/social_media_builder_spec.rb +++ b/engines/dfc_provider/spec/services/social_media_builder_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe SocialMediaBuilder do +RSpec.describe SocialMediaBuilder do let(:enterprise) do create( :enterprise, diff --git a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb index 12bc49f518e..3e582a7aa48 100644 --- a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb +++ b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb @@ -2,7 +2,7 @@ require_relative "../spec_helper" -describe SuppliedProductBuilder do +RSpec.describe SuppliedProductBuilder do include FileHelper subject(:builder) { described_class } diff --git a/engines/order_management/spec/services/order_management/order/stripe_sca_payment_authorize_spec.rb b/engines/order_management/spec/services/order_management/order/stripe_sca_payment_authorize_spec.rb index afe866f15bd..338d938a1ad 100644 --- a/engines/order_management/spec/services/order_management/order/stripe_sca_payment_authorize_spec.rb +++ b/engines/order_management/spec/services/order_management/order/stripe_sca_payment_authorize_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Order - describe StripeScaPaymentAuthorize do + RSpec.describe StripeScaPaymentAuthorize do let(:order) { create(:order) } let(:payment_authorize) { OrderManagement::Order::StripeScaPaymentAuthorize.new(order) diff --git a/engines/order_management/spec/services/order_management/order/updater_spec.rb b/engines/order_management/spec/services/order_management/order/updater_spec.rb index 6c2542b9e06..4b1eb0689e2 100644 --- a/engines/order_management/spec/services/order_management/order/updater_spec.rb +++ b/engines/order_management/spec/services/order_management/order/updater_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Order - describe Updater do + RSpec.describe Updater do let(:order) { create(:order) } let(:updater) { OrderManagement::Order::Updater.new(order) } diff --git a/engines/order_management/spec/services/order_management/stock/coordinator_spec.rb b/engines/order_management/spec/services/order_management/stock/coordinator_spec.rb index ee93585dd65..9acc53675f1 100644 --- a/engines/order_management/spec/services/order_management/stock/coordinator_spec.rb +++ b/engines/order_management/spec/services/order_management/stock/coordinator_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Stock - describe Coordinator do + RSpec.describe Coordinator do let!(:order) do build_stubbed( :order_with_line_items, diff --git a/engines/order_management/spec/services/order_management/stock/estimator_spec.rb b/engines/order_management/spec/services/order_management/stock/estimator_spec.rb index 042b4958d23..0c31ebe454e 100644 --- a/engines/order_management/spec/services/order_management/stock/estimator_spec.rb +++ b/engines/order_management/spec/services/order_management/stock/estimator_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Stock - describe Estimator do + RSpec.describe Estimator do let!(:shipping_method) { create(:shipping_method, zones: [create(:zone)] ) } let(:package) { build(:stock_package_fulfilled) } let(:order) { package.order } diff --git a/engines/order_management/spec/services/order_management/stock/package_spec.rb b/engines/order_management/spec/services/order_management/stock/package_spec.rb index 64a9fd46d31..22b97eb1ffb 100644 --- a/engines/order_management/spec/services/order_management/stock/package_spec.rb +++ b/engines/order_management/spec/services/order_management/stock/package_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Stock - describe Package do + RSpec.describe Package do context "base tests" do let(:variant) { build(:variant, weight: 25.0) } let(:stock_location) { build(:stock_location) } diff --git a/engines/order_management/spec/services/order_management/stock/packer_spec.rb b/engines/order_management/spec/services/order_management/stock/packer_spec.rb index 80666eb3d4d..1b0895bc28c 100644 --- a/engines/order_management/spec/services/order_management/stock/packer_spec.rb +++ b/engines/order_management/spec/services/order_management/stock/packer_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Stock - describe Packer do + RSpec.describe Packer do let(:distributor) { create(:distributor_enterprise) } let(:order) { create(:order_with_line_items, line_items_count: 5, distributor:) } let(:stock_location) { create(:stock_location) } diff --git a/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb b/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb index b1783eb7348..c521eaad84b 100644 --- a/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb +++ b/engines/order_management/spec/services/order_management/stock/prioritizer_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Stock - describe Prioritizer do + RSpec.describe Prioritizer do let(:order) { create(:order_with_line_items, line_items_count: 2) } let(:stock_location) { build(:stock_location) } let(:variant1) { order.line_items[0].variant } diff --git a/engines/order_management/spec/services/order_management/subscriptions/count_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/count_spec.rb index 75b4e471116..a8521309323 100644 --- a/engines/order_management/spec/services/order_management/subscriptions/count_spec.rb +++ b/engines/order_management/spec/services/order_management/subscriptions/count_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Subscriptions - describe Count do + RSpec.describe Count do let(:oc1) { create(:simple_order_cycle) } let(:oc2) { create(:simple_order_cycle) } let(:subscriptions_count) { Count.new(order_cycles) } diff --git a/engines/order_management/spec/services/order_management/subscriptions/estimator_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/estimator_spec.rb index 238aa8e3229..5a4c91f71d5 100644 --- a/engines/order_management/spec/services/order_management/subscriptions/estimator_spec.rb +++ b/engines/order_management/spec/services/order_management/subscriptions/estimator_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Subscriptions - describe Estimator do + RSpec.describe Estimator do describe "estimating prices for subscription line items" do let!(:subscription) { create(:subscription, with_items: true) } let!(:sli1) { subscription.subscription_line_items.first } diff --git a/engines/order_management/spec/services/order_management/subscriptions/form_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/form_spec.rb index 56122e12e6a..c915ff0e991 100644 --- a/engines/order_management/spec/services/order_management/subscriptions/form_spec.rb +++ b/engines/order_management/spec/services/order_management/subscriptions/form_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Subscriptions - describe Form do + RSpec.describe Form do describe "creating a new subscription" do let!(:shop) { create(:distributor_enterprise) } let!(:customer) { create(:customer, enterprise: shop) } diff --git a/engines/order_management/spec/services/order_management/subscriptions/payment_setup_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/payment_setup_spec.rb index 035021eb49a..297fc841a70 100644 --- a/engines/order_management/spec/services/order_management/subscriptions/payment_setup_spec.rb +++ b/engines/order_management/spec/services/order_management/subscriptions/payment_setup_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Subscriptions - describe PaymentSetup do + RSpec.describe PaymentSetup do let(:order) { create(:order) } let(:payment_setup) { OrderManagement::Subscriptions::PaymentSetup.new(order) } diff --git a/engines/order_management/spec/services/order_management/subscriptions/proxy_order_syncer_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/proxy_order_syncer_spec.rb index fcf06793df0..91dcc2a32a3 100644 --- a/engines/order_management/spec/services/order_management/subscriptions/proxy_order_syncer_spec.rb +++ b/engines/order_management/spec/services/order_management/subscriptions/proxy_order_syncer_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Subscriptions - describe ProxyOrderSyncer do + RSpec.describe ProxyOrderSyncer do describe "initialization" do let!(:subscription) { create(:subscription) } diff --git a/engines/order_management/spec/services/order_management/subscriptions/stripe_payment_setup_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/stripe_payment_setup_spec.rb index 9c4e97157c9..6db96cf112c 100644 --- a/engines/order_management/spec/services/order_management/subscriptions/stripe_payment_setup_spec.rb +++ b/engines/order_management/spec/services/order_management/subscriptions/stripe_payment_setup_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Subscriptions - describe StripePaymentSetup do + RSpec.describe StripePaymentSetup do let(:order) { create(:order) } let(:payment_setup) { OrderManagement::Subscriptions::StripePaymentSetup.new(order) } diff --git a/engines/order_management/spec/services/order_management/subscriptions/summarizer_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/summarizer_spec.rb index 8333eda9062..a442a76f6fd 100644 --- a/engines/order_management/spec/services/order_management/subscriptions/summarizer_spec.rb +++ b/engines/order_management/spec/services/order_management/subscriptions/summarizer_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Subscriptions - describe Summarizer do + RSpec.describe Summarizer do let(:order) { create(:order) } let(:summarizer) { OrderManagement::Subscriptions::Summarizer.new } diff --git a/engines/order_management/spec/services/order_management/subscriptions/summary_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/summary_spec.rb index 6aeb292bf23..5c877800a52 100644 --- a/engines/order_management/spec/services/order_management/subscriptions/summary_spec.rb +++ b/engines/order_management/spec/services/order_management/subscriptions/summary_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Subscriptions - describe Summary do + RSpec.describe Summary do let(:summary) { OrderManagement::Subscriptions::Summary.new(123) } describe "#initialize" do diff --git a/engines/order_management/spec/services/order_management/subscriptions/validator_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/validator_spec.rb index 55e4d28944b..2d76ac4acee 100644 --- a/engines/order_management/spec/services/order_management/subscriptions/validator_spec.rb +++ b/engines/order_management/spec/services/order_management/subscriptions/validator_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Subscriptions - describe Validator do + RSpec.describe Validator do let(:owner) { create(:user) } let(:shop) { create(:enterprise, name: "Shop", owner:) } diff --git a/engines/order_management/spec/services/order_management/subscriptions/variants_list_spec.rb b/engines/order_management/spec/services/order_management/subscriptions/variants_list_spec.rb index dc51f14f8e0..bb95c0dc775 100644 --- a/engines/order_management/spec/services/order_management/subscriptions/variants_list_spec.rb +++ b/engines/order_management/spec/services/order_management/subscriptions/variants_list_spec.rb @@ -4,7 +4,7 @@ module OrderManagement module Subscriptions - describe VariantsList do + RSpec.describe VariantsList do describe "variant eligibility for subscription" do let!(:shop) { create(:distributor_enterprise) } let!(:producer) { create(:supplier_enterprise) } diff --git a/engines/web/spec/helpers/cookies_policy_helper_spec.rb b/engines/web/spec/helpers/cookies_policy_helper_spec.rb index 02ff9910a0b..81a779c7ddc 100644 --- a/engines/web/spec/helpers/cookies_policy_helper_spec.rb +++ b/engines/web/spec/helpers/cookies_policy_helper_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Web - describe CookiesPolicyHelper, type: :helper do + RSpec.describe CookiesPolicyHelper, type: :helper do # keeps global state unchanged around do |example| original_locale = I18n.locale diff --git a/lib/discourse/single_sign_on.rb b/lib/discourse/single_sign_on.rb deleted file mode 100644 index 5e2db794617..00000000000 --- a/lib/discourse/single_sign_on.rb +++ /dev/null @@ -1,107 +0,0 @@ -# frozen_string_literal: true - -# This class is the reference implementation of a SSO provider from Discourse. - -module Discourse - class SingleSignOn - ACCESSORS = [:nonce, :name, :username, :email, :avatar_url, :avatar_force_update, - :require_activation, :about_me, :external_id, :return_sso_url, :admin, :moderator, - :suppress_welcome_message].freeze - FIXNUMS = [].freeze - BOOLS = [:avatar_force_update, :admin, :moderator, :require_activation, - :suppress_welcome_message].freeze - NONCE_EXPIRY_TIME = 10.minutes - - attr_accessor(*ACCESSORS, :sso_secret, :sso_url) - - def self.sso_secret - raise "sso_secret not implemented on class, be sure to set it on instance" - end - - def self.sso_url - raise "sso_url not implemented on class, be sure to set it on instance" - end - - def self.parse(payload, sso_secret = nil) - sso = new - sso.sso_secret = sso_secret if sso_secret - - parsed = Rack::Utils.parse_query(payload) - if sso.sign(parsed["sso"]) != parsed["sig"] - diags = "\n\nsso: #{parsed['sso']}\n\nsig: #{parsed['sig']}\n\n" \ - "expected sig: #{sso.sign(parsed['sso'])}" - raise "Bad signature for payload #{diags}" unless parsed["sso"] =~ %r{[^a-zA-Z0-9=\r\n/+]}m - - raise "The SSO field should be Base64 encoded, using only A-Z, a-z, 0-9, +, /, " \ - "and = characters. Your input contains characters we don't understand as Base64, " \ - "see http://en.wikipedia.org/wiki/Base64 #{diags}" - - end - - decoded = Base64.decode64(parsed["sso"]) - decoded_hash = Rack::Utils.parse_query(decoded) - - ACCESSORS.each do |k| - val = decoded_hash[k.to_s] - val = val.to_i if FIXNUMS.include? k - if BOOLS.include? k - val = ["true", "false"].include?(val) ? val == "true" : nil - end - sso.public_send("#{k}=", val) - end - - decoded_hash.each do |k, v| - # 1234567 - # custom. - # - if k[0..6] == "custom." - field = k[7..-1] - sso.custom_fields[field] = v - end - end - - sso - end - - def sso_secret - @sso_secret || self.class.sso_secret - end - - def sso_url - @sso_url || self.class.sso_url - end - - def custom_fields - @custom_fields ||= {} - end - - def sign(payload) - OpenSSL::HMAC.hexdigest("sha256", sso_secret, payload) - end - - def to_url(base_url = nil) - base = (base_url || sso_url).to_s - "#{base}#{base.include?('?') ? '&' : '?'}#{payload}" - end - - def payload - payload = Base64.encode64(unsigned_payload) - "sso=#{CGI.escape(payload)}&sig=#{sign(payload)}" - end - - def unsigned_payload - payload = {} - ACCESSORS.each do |k| - next if (val = public_send k).nil? - - payload[k] = val - end - - @custom_fields&.each do |k, v| - payload["custom.#{k}"] = v.to_s - end - - Rack::Utils.build_query(payload) - end - end -end diff --git a/lib/open_food_network/column_preference_defaults.rb b/lib/open_food_network/column_preference_defaults.rb index 9bb09b20616..f851efc7948 100644 --- a/lib/open_food_network/column_preference_defaults.rb +++ b/lib/open_food_network/column_preference_defaults.rb @@ -77,6 +77,24 @@ def products_index_columns } end + def products_v3_index_columns + I18n.with_options scope: 'admin.products_page.columns' do + { + image: { name: t(:image), visible: true }, + name: { name: t(:name), visible: true }, + sku: { name: t(:sku), visible: true }, + unit: { name: t(:unit), visible: true }, + unit_scale: { name: t(:unit_scale), visible: true }, + price: { name: t(:price), visible: true }, + on_hand: { name: t(:on_hand), visible: true }, + producer: { name: t(:producer), visible: true }, + category: { name: t(:category), visible: true }, + tax_category: { name: t(:tax_category), visible: true }, + inherits_properties: { name: t(:inherits_properties), visible: true }, + } + end + end + def enterprises_index_columns node = "admin.enterprises.index" { diff --git a/lib/reporting/queries/query_builder.rb b/lib/reporting/queries/query_builder.rb index 02e908ab2d2..23697a68248 100644 --- a/lib/reporting/queries/query_builder.rb +++ b/lib/reporting/queries/query_builder.rb @@ -15,7 +15,7 @@ def initialize(model, grouping_fields = proc { [] }) end def selecting(lambda) - fields = instance_exec(&lambda).map{ |key, value| value.public_send(:as, key.to_s) } + fields = instance_exec(&lambda).map{ |key, value| value.as(key.to_s) } reflect query.project(*fields) end diff --git a/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_order.rb b/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_order.rb index 2ea4a4db141..6b099060768 100644 --- a/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_order.rb +++ b/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_order.rb @@ -7,7 +7,7 @@ class EnterpriseFeesWithTaxReportByOrder < ReportTemplate attr_accessor :parameters def initialize(user, params = {}, render: false) - super(user, params, render:) + super end def search diff --git a/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer.rb b/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer.rb index 2760112f1ba..a9e487c2e70 100644 --- a/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer.rb +++ b/lib/reporting/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer.rb @@ -7,7 +7,7 @@ class EnterpriseFeesWithTaxReportByProducer < ReportTemplate attr_accessor :permissions def initialize(user, params = {}, render: false) - super(user, params, render:) + super @permissions = Permissions.new(user) end diff --git a/lib/reporting/reports/enterprise_fee_summary/fee_summary.rb b/lib/reporting/reports/enterprise_fee_summary/fee_summary.rb index c2fc14159bf..61679e445ed 100644 --- a/lib/reporting/reports/enterprise_fee_summary/fee_summary.rb +++ b/lib/reporting/reports/enterprise_fee_summary/fee_summary.rb @@ -7,7 +7,7 @@ class FeeSummary < ReportTemplate attr_accessor :permissions, :parameters def initialize(user, params = {}, render: false) - super(user, params, render:) + super @parameters = Parameters.new(params.fetch(:q, {})) @parameters.validate! @permissions = Permissions.new(user) diff --git a/lib/reporting/reports/enterprise_fee_summary/parameters.rb b/lib/reporting/reports/enterprise_fee_summary/parameters.rb index 26c0b1dc068..f5a6febb173 100644 --- a/lib/reporting/reports/enterprise_fee_summary/parameters.rb +++ b/lib/reporting/reports/enterprise_fee_summary/parameters.rb @@ -28,7 +28,7 @@ def initialize(attributes = {}) self.shipping_method_ids = [] self.payment_method_ids = [] - super(attributes) + super cleanup_arrays end diff --git a/lib/reporting/reports/list.rb b/lib/reporting/reports/list.rb index 0af1ab3f69b..a2dd38efc32 100644 --- a/lib/reporting/reports/list.rb +++ b/lib/reporting/reports/list.rb @@ -62,8 +62,7 @@ def enterprise_fee_summary ], [ i18n_translate('enterprise_fees_with_tax_report_by_producer'), - :enterprise_fees_with_tax_report_by_producer, - { deprecated: true }, # Not supported until specific details are finalised. + :enterprise_fees_with_tax_report_by_producer ], ] end diff --git a/lib/spree/api/controller_setup.rb b/lib/spree/api/controller_setup.rb index 010ce77b1e3..dcc49e15f9e 100644 --- a/lib/spree/api/controller_setup.rb +++ b/lib/spree/api/controller_setup.rb @@ -22,7 +22,7 @@ def self.included(klass) include CanCan::ControllerAdditions include Spree::Core::ControllerHelpers::Auth - prepend_view_path Rails.root + "app/views" + prepend_view_path "#{Rails.root}app/views" append_view_path File.expand_path("../../../app/views", File.dirname(__FILE__)) end end diff --git a/lib/spree/authentication_helpers.rb b/lib/spree/authentication_helpers.rb index f463ebbdb41..d92febf78d4 100644 --- a/lib/spree/authentication_helpers.rb +++ b/lib/spree/authentication_helpers.rb @@ -3,9 +3,9 @@ module Spree module AuthenticationHelpers def self.included(receiver) - receiver.public_send :helper_method, :spree_current_user - receiver.public_send :helper_method, :spree_login_path - receiver.public_send :helper_method, :spree_logout_path + receiver.helper_method :spree_current_user + receiver.helper_method :spree_login_path + receiver.helper_method :spree_logout_path end def spree_current_user diff --git a/lib/spree/core/environment_extension.rb b/lib/spree/core/environment_extension.rb index 56d54517eab..78f8bf8c126 100644 --- a/lib/spree/core/environment_extension.rb +++ b/lib/spree/core/environment_extension.rb @@ -9,11 +9,11 @@ def add_class(name) instance_variable_set "@#{name}", Set.new create_method( :"#{name}=" ) { |val| - instance_variable_set( "@" + name, val) + instance_variable_set( "@#{name}", val) } create_method(name.to_sym) do - instance_variable_get( "@" + name ) + instance_variable_get( "@#{name}" ) end end diff --git a/lib/tasks/data/check_invalid_address_used.rake b/lib/tasks/data/check_invalid_address_used.rake new file mode 100644 index 00000000000..2d831d265b1 --- /dev/null +++ b/lib/tasks/data/check_invalid_address_used.rake @@ -0,0 +1,118 @@ +# frozen_string_literal: true + +require 'csv' + +namespace :ofn do + namespace :data do + # Invalid address are define by having: address1, city, phone, or country_id set to null + desc 'Check if any invalid address are in use' + task check_invalid_address_used: :environment do # rubocop:disable Metrics/BlockLength + puts "Checking for invalid address" + invalid_addresses = Spree::Address + .where("address1 IS NULL OR city IS NULL OR phone IS NULL OR country_id IS NULL") + .pluck(:id) + + if invalid_addresses.empty? + puts "No invalid address found" + next + end + + puts "Checking if any of #{invalid_addresses.length} invalid addresses are in use" + + # Customer : + # - bill_address + # - ship_address + customer_used_address = check_bill_ship_address(Customer, invalid_addresses) + p "Customers #{customer_used_address}" + + # Subscription : + # - bill_address + # - ship_address + subscriptions_used_address = check_bill_ship_address(Subscription, invalid_addresses) + p "Subscriptions #{subscriptions_used_address}" + + # EnterpriseGroup : + # - enterprise_group address + enterprise_group_used_address = check_address(EnterpriseGroup, invalid_addresses) + p "EnterpriseGroup #{enterprise_group_used_address}" + + # User : + # - bill_address + # - ship_address + users_used_address = check_bill_ship_address(Spree::User, invalid_addresses) + p "User #{users_used_address}" + + # Order : + # - bill_address + # - ship_address + orders_used_address = check_bill_ship_address(Spree::Order, invalid_addresses) + p "Order #{orders_used_address}" + + # Shipment : + # - address + shipments_used_address = check_address(Spree::Shipment, invalid_addresses) + p "Shipments #{shipments_used_address}" + + # Enterprise : + # - address + # - business_address + enterprises = Enterprise + .left_joins(:address, :business_address) + .where( + "address_id IN(?) OR business_address_id IN(?)", invalid_addresses, invalid_addresses + ) + enterprise_used_address = enterprises.map do |e| + res = [] + res << e.address_id if check_correct_address_id(e.address_id, invalid_addresses) + res << e.business_address_id if check_correct_address_id( + e.business_address_id, invalid_addresses + ) + res + end.flatten + p "Enterprises #{enterprise_used_address}" + + address_to_be_fixed = customer_used_address.union( + subscriptions_used_address, users_used_address, orders_used_address, shipments_used_address, + enterprise_used_address + ) + address_to_be_deleted = invalid_addresses - address_to_be_fixed + + puts "\n\n" + puts "#{address_to_be_deleted.length} addresses can be deleted:" + p address_to_be_deleted + + if address_to_be_deleted.present? + puts "\n\n" + puts "Run the following code to delete the addresses:" + puts "Spree::Address.where(id: #{address_to_be_deleted}).delete_all" + end + + puts "\n\n" + puts "#{address_to_be_fixed.length} addresses need to be fixed:" + p address_to_be_fixed + end + + private + + def check_bill_ship_address(klass, addresses) + objects = klass + .left_joins(:bill_address, :ship_address) + .where("bill_address_id in(?) OR ship_address_id in(?)", addresses, addresses) + + objects.map do |o| + res = [] + res << o.ship_address_id if check_correct_address_id(o.ship_address_id, addresses) + res << o.bill_address_id if check_correct_address_id(o.bill_address_id, addresses) + res + end.flatten + end + + def check_address(klass, addresses) + klass.joins(:address).where(address: addresses).pluck(:address_id) + end + + def check_correct_address_id(id, missing_ids) + !id.nil? && missing_ids.include?(id) + end + end +end diff --git a/lib/tasks/enterprises.rake b/lib/tasks/enterprises.rake index bc975295478..fa735853c26 100644 --- a/lib/tasks/enterprises.rake +++ b/lib/tasks/enterprises.rake @@ -31,8 +31,8 @@ namespace :ofn do def enterprise_header ['name', 'description', 'long_description', 'is_primary_producer', 'is_distributor', - 'contact_name', 'phone', 'email', 'website', 'twitter', 'abn', 'acn', 'pickup_times', - 'next_collection_at', 'distributor_info', 'visible', 'facebook', 'instagram', 'linkedin', + 'contact_name', 'phone', 'email', 'website', 'twitter', 'abn', 'acn', + 'visible', 'facebook', 'instagram', 'linkedin', 'address1', 'address2', 'city', 'zipcode', 'state', 'country'] end @@ -40,8 +40,8 @@ namespace :ofn do [enterprise.name, enterprise.description, enterprise.long_description, enterprise.is_primary_producer, enterprise.is_distributor, enterprise.contact_name, enterprise.phone, enterprise.email, enterprise.website, enterprise.twitter, enterprise.abn, - enterprise.acn, enterprise.pickup_times, enterprise.next_collection_at, - enterprise.distributor_info, enterprise.visible, enterprise.facebook, enterprise.instagram, + enterprise.acn, + enterprise.visible, enterprise.facebook, enterprise.instagram, enterprise.linkedin, enterprise.address.address1, enterprise.address.address2, enterprise.address.city, enterprise.address.zipcode, enterprise.address.state_name, enterprise.address.country&.name] diff --git a/lib/tasks/karma.rake b/lib/tasks/karma.rake index 3ee505f7315..0c2183c6e99 100644 --- a/lib/tasks/karma.rake +++ b/lib/tasks/karma.rake @@ -39,6 +39,6 @@ namespace :karma do I18n::JS::DEFAULT_EXPORT_DIR_PATH.replace('tmp/javascripts') I18n::JS.export - "#{Rails.root.join(I18n::JS::DEFAULT_EXPORT_DIR_PATH, 'translations.js')}" + Rails.root.join(I18n::JS::DEFAULT_EXPORT_DIR_PATH, 'translations.js').to_s end end diff --git a/package.json b/package.json index 888b14112cb..d4b52d637fb 100644 --- a/package.json +++ b/package.json @@ -10,26 +10,30 @@ "pretty-quick": "pretty-quick" }, "dependencies": { - "@floating-ui/dom": "^1.6.3", + "@floating-ui/dom": "^1.6.5", + "@hotwired/stimulus": "^3.2", "@hotwired/turbo": "^8.0.4", "@rails/webpacker": "5.4.4", "@stimulus-components/rails-nested-form": "^5.0.0", - "cable_ready": "5.0.1", + "cable_ready": "5.0.5", "debounced": "^0.0.5", "flatpickr": "^4.6.9", "foundation-sites": "^5.5.3", "hotkeys-js": "^3.13.7", - "jquery-ui": "1.13.2", + "jquery-ui": "1.13.3", "js-big-decimal": "^2.0.7", + "leaflet": "1.9.4", + "leaflet-geosearch": "4.0.0", + "leaflet-providers": "2.0.0", "moment": "^2.30.1", "mrujs": "^1.0.0", "select2": "^4.0.13", "shortcut-buttons-flatpickr": "^0.4.0", "stimulus": "^3.2.2", "stimulus-flatpickr": "^1.4.0", - "stimulus_reflex": "3.5.0-rc3", + "stimulus_reflex": "3.5.1", "tom-select": "^2.3.1", - "trix": "^2.1.0", + "trix": "^2.1.1", "webpack": "~4" }, "devDependencies": { diff --git a/public/invalid_image.jpg b/public/invalid_image.jpg new file mode 100755 index 00000000000..1af492828fc Binary files /dev/null and b/public/invalid_image.jpg differ diff --git a/spec/base_spec_helper.rb b/spec/base_spec_helper.rb index 1238281f003..8a6e29a22e2 100644 --- a/spec/base_spec_helper.rb +++ b/spec/base_spec_helper.rb @@ -32,7 +32,7 @@ WebMock.enable! WebMock.disable_net_connect!( allow_localhost: true, - allow: ['chromedriver.storage.googleapis.com', 'api.knapsackpro.com'] + allow: ['chromedriver.storage.googleapis.com'] ) # Requires supporting ruby files with custom matchers and macros, etc, @@ -60,7 +60,7 @@ RSpec.configure do |config| # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures - config.fixture_path = "#{Rails.root.join('spec/fixtures')}" + config.fixture_path = Rails.root.join('spec/fixtures').to_s # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false @@ -94,15 +94,58 @@ # Force use of expect (over should) config.expect_with :rspec do |expectations| expectations.syntax = :expect + + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # We use too many mocks at the moment. Activating the following + # feature fails a lot of specs. We should clean it up over time. + # + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + # mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # https://rspec.info/features/3-12/rspec-core/configuration/zero-monkey-patching-mode/ + config.disable_monkey_patching! + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" end # Reset locale for all specs. config.around(:each) do |example| - I18n.with_locale(:en) { example.run } + I18n.with_locale(:en_AU) { example.run } end # Reset all feature toggles to prevent leaking. - config.before(:suite) do + config.before(:each) do Flipper.features.each(&:remove) OpenFoodNetwork::FeatureToggle.setup! end @@ -182,11 +225,6 @@ end end - # Geocoding - config.before(:each) { - allow_any_instance_of(Spree::Address).to receive(:geocode).and_return([1, 1]) - } - default_country_id = DefaultCountry.id checkout_zone = Spree::Config[:checkout_zone] currency = Spree::Config[:currency] diff --git a/spec/components/distributor_title_component_spec.rb b/spec/components/distributor_title_component_spec.rb index b678027f493..c88b76eb671 100644 --- a/spec/components/distributor_title_component_spec.rb +++ b/spec/components/distributor_title_component_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "DistributorTitle tests", type: :component do +RSpec.describe "DistributorTitle tests", type: :component do it "displays distributor title with its name" do render_inline(DistributorTitleComponent.new(name: "Freddy's Farm Shop")) {} expect(page).to have_selector "h3", text: "Freddy's Farm Shop" diff --git a/spec/components/example_component_spec.rb b/spec/components/example_component_spec.rb index f40eeb5ee8a..540d7a4364f 100644 --- a/spec/components/example_component_spec.rb +++ b/spec/components/example_component_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "ExampleComponent tests", type: :component do +RSpec.describe "ExampleComponent tests", type: :component do it "displays the h1 with the given parameter" do render_inline(ExampleComponent.new(title: "Hello")) {} expect(page).to have_selector "h1", text: "Hello" diff --git a/spec/components/vertical_ellipsis_menu_component_spec.rb b/spec/components/vertical_ellipsis_menu_component_spec.rb index cdbdea159f2..3f8a37bab18 100644 --- a/spec/components/vertical_ellipsis_menu_component_spec.rb +++ b/spec/components/vertical_ellipsis_menu_component_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe VerticalEllipsisMenu::Component, type: :component do +RSpec.describe VerticalEllipsisMenu::Component, type: :component do it "displays the included links" do content = "Edit" render_inline(described_class.new.with_content(content.html_safe)) diff --git a/spec/constraints/feature_toggle_constraint_spec.rb b/spec/constraints/feature_toggle_constraint_spec.rb index 4c9e477d17e..6738c64480b 100644 --- a/spec/constraints/feature_toggle_constraint_spec.rb +++ b/spec/constraints/feature_toggle_constraint_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe FeatureToggleConstraint do +RSpec.describe FeatureToggleConstraint do subject { described_class.new("baking") } let(:request) { double(env:) } let(:env) { {} } diff --git a/spec/controllers/admin/bulk_line_items_controller_spec.rb b/spec/controllers/admin/bulk_line_items_controller_spec.rb index 15e540c97b4..1a3a4d28524 100644 --- a/spec/controllers/admin/bulk_line_items_controller_spec.rb +++ b/spec/controllers/admin/bulk_line_items_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::BulkLineItemsController, type: :controller do +RSpec.describe Admin::BulkLineItemsController, type: :controller do describe '#index' do render_views diff --git a/spec/controllers/admin/column_preferences_controller_spec.rb b/spec/controllers/admin/column_preferences_controller_spec.rb index 0c46af6ecd7..c29153534d7 100644 --- a/spec/controllers/admin/column_preferences_controller_spec.rb +++ b/spec/controllers/admin/column_preferences_controller_spec.rb @@ -2,20 +2,33 @@ require 'spec_helper' -describe Admin::ColumnPreferencesController, type: :controller do +RSpec.describe Admin::ColumnPreferencesController, type: :controller do include AuthenticationHelper describe "bulk_update" do let!(:user1) { create(:user) } let!(:user2) { create(:user) } let!(:enterprise) { create(:enterprise, owner: user1, users: [user1, user2]) } + let!(:column_preference) { + ColumnPreference.create(user_id: user1.id, action_name: 'enterprises_index', + column_name: "name", visible: true) + } - context "json" do - let!(:column_preference) { - ColumnPreference.create(user_id: user1.id, action_name: 'enterprises_index', - column_name: "name", visible: true) - } + shared_examples "where I own the preferences submitted" do + before do + allow(controller).to receive(:spree_current_user) { user1 } + end + it "allows me to update the column preferences" do + spree_put :bulk_update, format: request_format, action_name: "enterprises_index", + column_preferences: column_preference_params + expect(ColumnPreference.where(user_id: user1.id, + action_name: 'enterprises_index').count).to be 3 + end + end + + context "json" do + let(:request_format) { :json } let(:column_preference_params) { [ { id: column_preference.id, user_id: user1.id, action_name: "enterprises_index", @@ -27,28 +40,47 @@ ] } + it_behaves_like "where I own the preferences submitted" + context "where I don't own the preferences submitted" do before do allow(controller).to receive(:spree_current_user) { user2 } end it "prevents me from updating the column preferences" do - spree_put :bulk_update, format: :json, action_name: "enterprises_index", + spree_put :bulk_update, format: request_format, action_name: "enterprises_index", column_preferences: column_preference_params expect(ColumnPreference.count).to be 1 end end + end - context "where I own the preferences submitted" do + context "turbo_stream" do + let(:request_format) { :turbo_stream } + let(:column_preference_params) { + { + '0': { id: column_preference.id, column_name: "name", visible: "0" }, + '1': { id: nil, column_name: "producer", visible: "1" }, + '2': { id: nil, column_name: "status", visible: "1" }, + } + } + + it_behaves_like "where I own the preferences submitted" + + context "where I don't own the preferences submitted" do before do - allow(controller).to receive(:spree_current_user) { user1 } + allow(controller).to receive(:spree_current_user) { user2 } end - it "allows me to update the column preferences" do - spree_put :bulk_update, format: :json, action_name: "enterprises_index", - column_preferences: column_preference_params - expect(ColumnPreference.where(user_id: user1.id, - action_name: 'enterprises_index').count).to be 3 + # This has the same effect as the JSON action, but due to differing implementation, + # it has different expections. + it "prevents me from updating the column preferences" do + expect { + spree_put :bulk_update, format: request_format, action_name: "enterprises_index", + column_preferences: column_preference_params + }.to raise_error(ActiveRecord::RecordNotUnique) + + expect(column_preference.reload.visible).to eq true end end end diff --git a/spec/controllers/admin/customers_controller_spec.rb b/spec/controllers/admin/customers_controller_spec.rb index f7397e58ab1..d8d464fcb05 100644 --- a/spec/controllers/admin/customers_controller_spec.rb +++ b/spec/controllers/admin/customers_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Admin - describe CustomersController, type: :controller do + RSpec.describe CustomersController, type: :controller do include AuthenticationHelper describe "index" do diff --git a/spec/controllers/admin/enterprises_controller_spec.rb b/spec/controllers/admin/enterprises_controller_spec.rb index 9c033da7069..4caf3e38d79 100644 --- a/spec/controllers/admin/enterprises_controller_spec.rb +++ b/spec/controllers/admin/enterprises_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'open_food_network/order_cycle_permissions' -describe Admin::EnterprisesController, type: :controller do +RSpec.describe Admin::EnterprisesController, type: :controller do let(:user) { create(:user) } let(:admin_user) { create(:admin_user) } let(:distributor_manager) { create(:user, enterprise_limit: 10, enterprises: [distributor]) } diff --git a/spec/controllers/admin/inventory_items_controller_spec.rb b/spec/controllers/admin/inventory_items_controller_spec.rb index cf29a2d39c0..8375a89bbd3 100644 --- a/spec/controllers/admin/inventory_items_controller_spec.rb +++ b/spec/controllers/admin/inventory_items_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::InventoryItemsController, type: :controller do +RSpec.describe Admin::InventoryItemsController, type: :controller do describe "create" do context "json" do let(:format) { :json } diff --git a/spec/controllers/admin/invoice_settings_controller_spec.rb b/spec/controllers/admin/invoice_settings_controller_spec.rb index b575d822d42..de8edc2a626 100644 --- a/spec/controllers/admin/invoice_settings_controller_spec.rb +++ b/spec/controllers/admin/invoice_settings_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::InvoiceSettingsController, type: :controller do +RSpec.describe Admin::InvoiceSettingsController, type: :controller do describe "#update" do let(:params) { { diff --git a/spec/controllers/admin/matomo_settings_controller_spec.rb b/spec/controllers/admin/matomo_settings_controller_spec.rb index 26b5f8d6047..f488bd96370 100644 --- a/spec/controllers/admin/matomo_settings_controller_spec.rb +++ b/spec/controllers/admin/matomo_settings_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::MatomoSettingsController, type: :controller do +RSpec.describe Admin::MatomoSettingsController, type: :controller do describe "#update" do let(:params) { { diff --git a/spec/controllers/admin/order_cycles_controller_spec.rb b/spec/controllers/admin/order_cycles_controller_spec.rb index fd154b71181..aaeafbd8d75 100644 --- a/spec/controllers/admin/order_cycles_controller_spec.rb +++ b/spec/controllers/admin/order_cycles_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Admin - describe OrderCyclesController, type: :controller do + RSpec.describe OrderCyclesController, type: :controller do let!(:distributor_owner) { create(:user) } before do diff --git a/spec/controllers/admin/product_import_controller_spec.rb b/spec/controllers/admin/product_import_controller_spec.rb index 88f6793ad5a..404e4ed7631 100644 --- a/spec/controllers/admin/product_import_controller_spec.rb +++ b/spec/controllers/admin/product_import_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::ProductImportController, type: :controller do +RSpec.describe Admin::ProductImportController, type: :controller do describe 'validate_file_path' do context 'file extension' do it 'should authorize csv extension' do diff --git a/spec/controllers/admin/proxy_orders_controller_spec.rb b/spec/controllers/admin/proxy_orders_controller_spec.rb index 6e505530b62..7882fd96c42 100644 --- a/spec/controllers/admin/proxy_orders_controller_spec.rb +++ b/spec/controllers/admin/proxy_orders_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::ProxyOrdersController, type: :controller do +RSpec.describe Admin::ProxyOrdersController, type: :controller do include AuthenticationHelper describe 'cancel' do diff --git a/spec/controllers/admin/reports_controller_spec.rb b/spec/controllers/admin/reports_controller_spec.rb index 318682a8e89..5e80fe5f685 100644 --- a/spec/controllers/admin/reports_controller_spec.rb +++ b/spec/controllers/admin/reports_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::ReportsController, type: :controller do +RSpec.describe Admin::ReportsController, type: :controller do # Given two distributors and two suppliers let(:bill_address) { create(:address) } let(:ship_address) { create(:address) } diff --git a/spec/controllers/admin/schedules_controller_spec.rb b/spec/controllers/admin/schedules_controller_spec.rb index 38b1f12e352..c47b9e7bc81 100644 --- a/spec/controllers/admin/schedules_controller_spec.rb +++ b/spec/controllers/admin/schedules_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::SchedulesController, type: :controller do +RSpec.describe Admin::SchedulesController, type: :controller do include AuthenticationHelper describe "index" do diff --git a/spec/controllers/admin/stripe_accounts_controller_spec.rb b/spec/controllers/admin/stripe_accounts_controller_spec.rb index a1b5df8d691..97aa99a8951 100644 --- a/spec/controllers/admin/stripe_accounts_controller_spec.rb +++ b/spec/controllers/admin/stripe_accounts_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::StripeAccountsController, type: :controller do +RSpec.describe Admin::StripeAccountsController, type: :controller do let(:enterprise) { create(:distributor_enterprise) } describe "#connect" do diff --git a/spec/controllers/admin/stripe_connect_settings_controller_spec.rb b/spec/controllers/admin/stripe_connect_settings_controller_spec.rb index c6e99d47a88..ac56335e2d6 100644 --- a/spec/controllers/admin/stripe_connect_settings_controller_spec.rb +++ b/spec/controllers/admin/stripe_connect_settings_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::StripeConnectSettingsController, type: :controller do +RSpec.describe Admin::StripeConnectSettingsController, type: :controller do let(:user) { create(:user) } let(:admin) { create(:admin_user) } diff --git a/spec/controllers/admin/subscription_line_items_controller_spec.rb b/spec/controllers/admin/subscription_line_items_controller_spec.rb index 1ac8b006d84..0a015046f20 100644 --- a/spec/controllers/admin/subscription_line_items_controller_spec.rb +++ b/spec/controllers/admin/subscription_line_items_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::SubscriptionLineItemsController, type: :controller do +RSpec.describe Admin::SubscriptionLineItemsController, type: :controller do include AuthenticationHelper describe "build" do diff --git a/spec/controllers/admin/subscriptions_controller_spec.rb b/spec/controllers/admin/subscriptions_controller_spec.rb index c00d8ae113a..3beaf5f5d55 100644 --- a/spec/controllers/admin/subscriptions_controller_spec.rb +++ b/spec/controllers/admin/subscriptions_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::SubscriptionsController, type: :controller do +RSpec.describe Admin::SubscriptionsController, type: :controller do include AuthenticationHelper describe 'index' do diff --git a/spec/controllers/admin/tag_rules_controller_spec.rb b/spec/controllers/admin/tag_rules_controller_spec.rb index 9f789c17841..66930b43cec 100644 --- a/spec/controllers/admin/tag_rules_controller_spec.rb +++ b/spec/controllers/admin/tag_rules_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::TagRulesController, type: :controller do +RSpec.describe Admin::TagRulesController, type: :controller do describe "destroy" do context "json" do let(:format) { :json } diff --git a/spec/controllers/admin/terms_of_service_files_controller_spec.rb b/spec/controllers/admin/terms_of_service_files_controller_spec.rb index de6b0ba1746..dac296ea955 100644 --- a/spec/controllers/admin/terms_of_service_files_controller_spec.rb +++ b/spec/controllers/admin/terms_of_service_files_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::TermsOfServiceFilesController, type: :controller do +RSpec.describe Admin::TermsOfServiceFilesController, type: :controller do context "a non-admin user" do let(:user) { create(:user) } diff --git a/spec/controllers/admin/variant_overrides_controller_spec.rb b/spec/controllers/admin/variant_overrides_controller_spec.rb index 4224452fb1a..7e37e63d600 100644 --- a/spec/controllers/admin/variant_overrides_controller_spec.rb +++ b/spec/controllers/admin/variant_overrides_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::VariantOverridesController, type: :controller do +RSpec.describe Admin::VariantOverridesController, type: :controller do describe "bulk_update" do context "json" do let(:format) { :json } diff --git a/spec/controllers/api/v0/base_controller_spec.rb b/spec/controllers/api/v0/base_controller_spec.rb index ae578015508..e98ab3e4f69 100644 --- a/spec/controllers/api/v0/base_controller_spec.rb +++ b/spec/controllers/api/v0/base_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::V0::BaseController do +RSpec.describe Api::V0::BaseController do render_views controller(Api::V0::BaseController) do skip_authorization_check only: :index diff --git a/spec/controllers/api/v0/customers_controller_spec.rb b/spec/controllers/api/v0/customers_controller_spec.rb index 83bd201b4f4..b232bdea45d 100644 --- a/spec/controllers/api/v0/customers_controller_spec.rb +++ b/spec/controllers/api/v0/customers_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Api - describe V0::CustomersController, type: :controller do + RSpec.describe V0::CustomersController, type: :controller do include AuthenticationHelper render_views diff --git a/spec/controllers/api/v0/enterprise_fees_controller_spec.rb b/spec/controllers/api/v0/enterprise_fees_controller_spec.rb index 40ed1e78e2b..06a7b564fe7 100644 --- a/spec/controllers/api/v0/enterprise_fees_controller_spec.rb +++ b/spec/controllers/api/v0/enterprise_fees_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Api - describe V0::EnterpriseFeesController, type: :controller do + RSpec.describe V0::EnterpriseFeesController, type: :controller do include AuthenticationHelper let!(:unreferenced_fee) { create(:enterprise_fee) } diff --git a/spec/controllers/api/v0/enterprises_controller_spec.rb b/spec/controllers/api/v0/enterprises_controller_spec.rb index b930acfeafc..d0529f3eeba 100644 --- a/spec/controllers/api/v0/enterprises_controller_spec.rb +++ b/spec/controllers/api/v0/enterprises_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::V0::EnterprisesController, type: :controller do +RSpec.describe Api::V0::EnterprisesController, type: :controller do render_views let(:enterprise) { create(:distributor_enterprise) } diff --git a/spec/controllers/api/v0/exchange_products_controller_spec.rb b/spec/controllers/api/v0/exchange_products_controller_spec.rb index 18c04f3825c..ea226a80f15 100644 --- a/spec/controllers/api/v0/exchange_products_controller_spec.rb +++ b/spec/controllers/api/v0/exchange_products_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Api - describe V0::ExchangeProductsController, type: :controller do + RSpec.describe V0::ExchangeProductsController, type: :controller do include AuthenticationHelper let(:order_cycle) { create(:order_cycle) } diff --git a/spec/controllers/api/v0/logos_controller_spec.rb b/spec/controllers/api/v0/logos_controller_spec.rb index 3d8c800ba08..323c11c4ea5 100644 --- a/spec/controllers/api/v0/logos_controller_spec.rb +++ b/spec/controllers/api/v0/logos_controller_spec.rb @@ -3,7 +3,7 @@ require "spec_helper" module Api - describe V0::LogosController, type: :controller do + RSpec.describe V0::LogosController, type: :controller do include AuthenticationHelper include FileHelper diff --git a/spec/controllers/api/v0/order_cycles_controller_spec.rb b/spec/controllers/api/v0/order_cycles_controller_spec.rb index a8640fa5813..c6c9257cfe7 100644 --- a/spec/controllers/api/v0/order_cycles_controller_spec.rb +++ b/spec/controllers/api/v0/order_cycles_controller_spec.rb @@ -3,7 +3,7 @@ require "spec_helper" module Api - describe V0::OrderCyclesController, type: :controller do + RSpec.describe V0::OrderCyclesController, type: :controller do let!(:distributor) { create(:distributor_enterprise) } let!(:order_cycle) { create(:simple_order_cycle, distributors: [distributor]) } let!(:exchange) { order_cycle.exchanges.to_enterprises(distributor).outgoing.first } diff --git a/spec/controllers/api/v0/orders_controller_spec.rb b/spec/controllers/api/v0/orders_controller_spec.rb index d727221cfe7..5f955cd573d 100644 --- a/spec/controllers/api/v0/orders_controller_spec.rb +++ b/spec/controllers/api/v0/orders_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Api - describe V0::OrdersController, type: :controller do + RSpec.describe V0::OrdersController, type: :controller do include AuthenticationHelper render_views diff --git a/spec/controllers/api/v0/product_images_controller_spec.rb b/spec/controllers/api/v0/product_images_controller_spec.rb index 2c0a380bee8..d010e7b6152 100644 --- a/spec/controllers/api/v0/product_images_controller_spec.rb +++ b/spec/controllers/api/v0/product_images_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::V0::ProductImagesController, type: :controller do +RSpec.describe Api::V0::ProductImagesController, type: :controller do include AuthenticationHelper include FileHelper render_views diff --git a/spec/controllers/api/v0/products_controller_spec.rb b/spec/controllers/api/v0/products_controller_spec.rb index 4abba9f3bd7..bd796be1ea8 100644 --- a/spec/controllers/api/v0/products_controller_spec.rb +++ b/spec/controllers/api/v0/products_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'spree/core/product_duplicator' -describe Api::V0::ProductsController, type: :controller do +RSpec.describe Api::V0::ProductsController, type: :controller do render_views let(:supplier) { create(:supplier_enterprise) } diff --git a/spec/controllers/api/v0/promo_images_controller_spec.rb b/spec/controllers/api/v0/promo_images_controller_spec.rb index 76e7288ae11..0b3d173efb6 100644 --- a/spec/controllers/api/v0/promo_images_controller_spec.rb +++ b/spec/controllers/api/v0/promo_images_controller_spec.rb @@ -3,7 +3,7 @@ require "spec_helper" module Api - describe V0::PromoImagesController, type: :controller do + RSpec.describe V0::PromoImagesController, type: :controller do include AuthenticationHelper include FileHelper diff --git a/spec/controllers/api/v0/reports/packing_report_spec.rb b/spec/controllers/api/v0/reports/packing_report_spec.rb index a88a26c7d09..1b35ddbe663 100644 --- a/spec/controllers/api/v0/reports/packing_report_spec.rb +++ b/spec/controllers/api/v0/reports/packing_report_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Api::V0::ReportsController, type: :controller do +RSpec.describe Api::V0::ReportsController, type: :controller do let(:params) { { report_type: 'packing', diff --git a/spec/controllers/api/v0/reports_controller_spec.rb b/spec/controllers/api/v0/reports_controller_spec.rb index e50c55cbdc8..6c6000300d8 100644 --- a/spec/controllers/api/v0/reports_controller_spec.rb +++ b/spec/controllers/api/v0/reports_controller_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Api::V0::ReportsController, type: :controller do +RSpec.describe Api::V0::ReportsController, type: :controller do let(:enterprise_user) { create(:user, enterprises: [create(:enterprise)]) } let(:params) { { diff --git a/spec/controllers/api/v0/shipments_controller_spec.rb b/spec/controllers/api/v0/shipments_controller_spec.rb index add3d0c3bae..f7c9584e011 100644 --- a/spec/controllers/api/v0/shipments_controller_spec.rb +++ b/spec/controllers/api/v0/shipments_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::V0::ShipmentsController, type: :controller do +RSpec.describe Api::V0::ShipmentsController, type: :controller do render_views let!(:shipment) { create(:shipment) } diff --git a/spec/controllers/api/v0/shops_controller_spec.rb b/spec/controllers/api/v0/shops_controller_spec.rb index 2863aaef531..d1842ac53d0 100644 --- a/spec/controllers/api/v0/shops_controller_spec.rb +++ b/spec/controllers/api/v0/shops_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::V0::ShopsController, type: :controller do +RSpec.describe Api::V0::ShopsController, type: :controller do include AuthenticationHelper render_views diff --git a/spec/controllers/api/v0/states_controller_spec.rb b/spec/controllers/api/v0/states_controller_spec.rb index 19993200e23..e8f5267db8e 100644 --- a/spec/controllers/api/v0/states_controller_spec.rb +++ b/spec/controllers/api/v0/states_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Api - describe V0::StatesController do + RSpec.describe V0::StatesController do render_views let!(:state) { create(:state, name: "Victoria") } diff --git a/spec/controllers/api/v0/statuses_controller_spec.rb b/spec/controllers/api/v0/statuses_controller_spec.rb index 32ef605a51f..cf95869bace 100644 --- a/spec/controllers/api/v0/statuses_controller_spec.rb +++ b/spec/controllers/api/v0/statuses_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Api - describe V0::StatusesController, type: :controller do + RSpec.describe V0::StatusesController, type: :controller do render_views describe "job queue status" do diff --git a/spec/controllers/api/v0/taxonomies_controller_spec.rb b/spec/controllers/api/v0/taxonomies_controller_spec.rb index dfa5c2c25bc..3426342ed50 100644 --- a/spec/controllers/api/v0/taxonomies_controller_spec.rb +++ b/spec/controllers/api/v0/taxonomies_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Api - describe V0::TaxonomiesController do + RSpec.describe V0::TaxonomiesController do render_views let(:taxonomy) { create(:taxonomy) } diff --git a/spec/controllers/api/v0/taxons_controller_spec.rb b/spec/controllers/api/v0/taxons_controller_spec.rb index 6bd3fe8586e..8666749deb4 100644 --- a/spec/controllers/api/v0/taxons_controller_spec.rb +++ b/spec/controllers/api/v0/taxons_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::V0::TaxonsController do +RSpec.describe Api::V0::TaxonsController do render_views let(:taxonomy) { create(:taxonomy) } diff --git a/spec/controllers/api/v0/terms_and_conditions_controller_spec.rb b/spec/controllers/api/v0/terms_and_conditions_controller_spec.rb index 53596f7fd32..1ca17ec0d91 100644 --- a/spec/controllers/api/v0/terms_and_conditions_controller_spec.rb +++ b/spec/controllers/api/v0/terms_and_conditions_controller_spec.rb @@ -3,7 +3,7 @@ require "spec_helper" module Api - describe V0::TermsAndConditionsController, type: :controller do + RSpec.describe V0::TermsAndConditionsController, type: :controller do include AuthenticationHelper include FileHelper diff --git a/spec/controllers/api/v0/variants_controller_spec.rb b/spec/controllers/api/v0/variants_controller_spec.rb index 1a90dd704a0..496af4d6b4b 100644 --- a/spec/controllers/api/v0/variants_controller_spec.rb +++ b/spec/controllers/api/v0/variants_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::V0::VariantsController, type: :controller do +RSpec.describe Api::V0::VariantsController, type: :controller do render_views let(:supplier) { create(:supplier_enterprise) } diff --git a/spec/controllers/base_controller_spec.rb b/spec/controllers/base_controller_spec.rb index 5158dd1c3ce..0c9ff572ad9 100644 --- a/spec/controllers/base_controller_spec.rb +++ b/spec/controllers/base_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe BaseController, type: :controller do +RSpec.describe BaseController, type: :controller do let(:oc) { instance_double(OrderCycle, id: 1) } let(:order) { instance_double(Spree::Order) } controller(BaseController) do diff --git a/spec/controllers/cart_controller_spec.rb b/spec/controllers/cart_controller_spec.rb index 70ef4fd4e50..07ac5c50e59 100644 --- a/spec/controllers/cart_controller_spec.rb +++ b/spec/controllers/cart_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe CartController, type: :controller do +RSpec.describe CartController, type: :controller do let(:order) { create(:order) } describe "basic behaviour" do diff --git a/spec/controllers/checkout_controller_spec.rb b/spec/controllers/checkout_controller_spec.rb index 4f948cdefae..ea761d876bd 100644 --- a/spec/controllers/checkout_controller_spec.rb +++ b/spec/controllers/checkout_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe CheckoutController, type: :controller do +RSpec.describe CheckoutController, type: :controller do let(:user) { order.user } let(:address) { create(:address) } let(:distributor) { create(:distributor_enterprise, with_payment_and_shipping: true) } @@ -308,6 +308,57 @@ end end + context "with no payment source" do + let(:checkout_params) do + { + order: { + payments_attributes: [ + { + payment_method_id:, + source_attributes: { + first_name: "Jane", + last_name: "Doe", + month: "", + year: "", + cc_type: "", + last_digits: "", + gateway_payment_profile_id: "" + } + } + ] + }, + commit: "Next - Order Summary" + } + end + + context "with a cash/check payment method" do + let!(:payment_method_id) { payment_method.id } + + it "updates and redirects to summary step" do + put(:update, params:) + + expect(response.status).to be 302 + expect(response).to redirect_to checkout_step_path(:summary) + expect(order.reload.state).to eq "confirmation" + end + end + + context "with a StripeSCA payment method" do + let(:stripe_payment_method) { + create(:stripe_sca_payment_method, distributor_ids: [distributor.id], + environment: Rails.env) + } + let!(:payment_method_id) { stripe_payment_method.id } + + it "updates and redirects to summary step" do + put(:update, params:) + expect(response.status).to eq 422 + expect(flash[:error]).to match "Saving failed, please update the highlighted fields." + expect(order.reload.state).to eq "payment" + end + end + end + context "with payment fees" do let(:payment_method_with_fee) do create(:payment_method, :flat_rate, amount: "1.23", distributors: [distributor]) diff --git a/spec/controllers/concerns/address_transformation_spec.rb b/spec/controllers/concerns/address_transformation_spec.rb index d8f9cf74c21..2f9f1d725e3 100644 --- a/spec/controllers/concerns/address_transformation_spec.rb +++ b/spec/controllers/concerns/address_transformation_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe AddressTransformation do +RSpec.describe AddressTransformation do include AddressTransformation describe "#transform_address!" do diff --git a/spec/controllers/concerns/extra_fields_spec.rb b/spec/controllers/concerns/extra_fields_spec.rb index 463427926bf..0c6d4a15697 100644 --- a/spec/controllers/concerns/extra_fields_spec.rb +++ b/spec/controllers/concerns/extra_fields_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ExtraFields do +RSpec.describe ExtraFields do let(:dummy_controller) { Api::V1::BaseController.new.extend ExtraFields } describe "#invalid_query_param" do diff --git a/spec/controllers/concerns/raising_parameters_spec.rb b/spec/controllers/concerns/raising_parameters_spec.rb index 73008f20cf8..1a7badf85d0 100644 --- a/spec/controllers/concerns/raising_parameters_spec.rb +++ b/spec/controllers/concerns/raising_parameters_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe RaisingParameters do +RSpec.describe RaisingParameters do describe "Parameters" do let(:params) do RaisingParameters::Parameters.new( diff --git a/spec/controllers/enterprises_controller_spec.rb b/spec/controllers/enterprises_controller_spec.rb index 3f50de9a397..014d21706b7 100644 --- a/spec/controllers/enterprises_controller_spec.rb +++ b/spec/controllers/enterprises_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe EnterprisesController, type: :controller do +RSpec.describe EnterprisesController, type: :controller do describe "shopping for a distributor" do let(:user) { create(:user) } let(:order) { controller.current_order(true) } diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb index 9240ba0cf8b..a7d91c3522e 100644 --- a/spec/controllers/groups_controller_spec.rb +++ b/spec/controllers/groups_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe GroupsController, type: :controller do +RSpec.describe GroupsController, type: :controller do render_views let!(:enterprise) { create(:distributor_enterprise) } diff --git a/spec/controllers/line_items_controller_spec.rb b/spec/controllers/line_items_controller_spec.rb index 28db84cd07c..a825e77b353 100644 --- a/spec/controllers/line_items_controller_spec.rb +++ b/spec/controllers/line_items_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe LineItemsController, type: :controller do +RSpec.describe LineItemsController, type: :controller do let(:user) { create(:user) } let(:distributor) { create(:distributor_enterprise) } let(:order_cycle) { create(:simple_order_cycle) } diff --git a/spec/controllers/payment_gateways/paypal_controller_spec.rb b/spec/controllers/payment_gateways/paypal_controller_spec.rb index d348054fde3..8eb2fb2191e 100644 --- a/spec/controllers/payment_gateways/paypal_controller_spec.rb +++ b/spec/controllers/payment_gateways/paypal_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module PaymentGateways - describe PaypalController, type: :controller do + RSpec.describe PaypalController, type: :controller do context '#cancel' do it 'redirects back to checkout' do expect(get(:cancel)).to redirect_to checkout_path diff --git a/spec/controllers/payment_gateways/stripe_controller_spec.rb b/spec/controllers/payment_gateways/stripe_controller_spec.rb index 9b2e3233d92..5f7d086c9ad 100644 --- a/spec/controllers/payment_gateways/stripe_controller_spec.rb +++ b/spec/controllers/payment_gateways/stripe_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module PaymentGateways - describe StripeController, type: :controller do + RSpec.describe StripeController, type: :controller do include StripeStubs let!(:distributor) { create(:distributor_enterprise, with_payment_and_shipping: true) } diff --git a/spec/controllers/registration_controller_spec.rb b/spec/controllers/registration_controller_spec.rb index 6fa9e867f44..bb87674ba99 100644 --- a/spec/controllers/registration_controller_spec.rb +++ b/spec/controllers/registration_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe RegistrationController, type: :controller do +RSpec.describe RegistrationController, type: :controller do describe "redirecting when user not logged in" do it "index" do get :index diff --git a/spec/controllers/shop_controller_spec.rb b/spec/controllers/shop_controller_spec.rb index b072152e726..9431411a824 100644 --- a/spec/controllers/shop_controller_spec.rb +++ b/spec/controllers/shop_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ShopController, type: :controller do +RSpec.describe ShopController, type: :controller do let!(:pm) { create(:payment_method) } let!(:sm) { create(:shipping_method) } let(:distributor) { diff --git a/spec/controllers/shops_controller_spec.rb b/spec/controllers/shops_controller_spec.rb index 97cea60cb98..a12a9640382 100644 --- a/spec/controllers/shops_controller_spec.rb +++ b/spec/controllers/shops_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ShopsController, type: :controller do +RSpec.describe ShopsController, type: :controller do include WebHelper render_views diff --git a/spec/controllers/spree/admin/adjustments_controller_spec.rb b/spec/controllers/spree/admin/adjustments_controller_spec.rb index a6ae8900714..93837dbfb84 100644 --- a/spec/controllers/spree/admin/adjustments_controller_spec.rb +++ b/spec/controllers/spree/admin/adjustments_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe Admin::AdjustmentsController, type: :controller do + RSpec.describe Admin::AdjustmentsController, type: :controller do include AuthenticationHelper before { controller_login_as_admin } diff --git a/spec/controllers/spree/admin/base_controller_spec.rb b/spec/controllers/spree/admin/base_controller_spec.rb index 21dbc71a4e8..63844e98833 100644 --- a/spec/controllers/spree/admin/base_controller_spec.rb +++ b/spec/controllers/spree/admin/base_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::BaseController, type: :controller do +RSpec.describe Spree::Admin::BaseController, type: :controller do controller(Spree::Admin::BaseController) do def index before_action :unauthorized diff --git a/spec/controllers/spree/admin/countries_controller_spec.rb b/spec/controllers/spree/admin/countries_controller_spec.rb index 87a9356f1ee..d5829a91493 100644 --- a/spec/controllers/spree/admin/countries_controller_spec.rb +++ b/spec/controllers/spree/admin/countries_controller_spec.rb @@ -4,7 +4,7 @@ module Spree module Admin - describe CountriesController, type: :controller do + RSpec.describe CountriesController, type: :controller do include AuthenticationHelper describe "#update" do diff --git a/spec/controllers/spree/admin/general_settings_controller_spec.rb b/spec/controllers/spree/admin/general_settings_controller_spec.rb index 3fff115d019..1a0e0b002f5 100644 --- a/spec/controllers/spree/admin/general_settings_controller_spec.rb +++ b/spec/controllers/spree/admin/general_settings_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::GeneralSettingsController, type: :controller do +RSpec.describe Spree::Admin::GeneralSettingsController, type: :controller do include AuthenticationHelper describe 'updating general settings' do diff --git a/spec/controllers/spree/admin/mail_methods_controller_spec.rb b/spec/controllers/spree/admin/mail_methods_controller_spec.rb index 43ff49f9f0f..163ec8f54be 100644 --- a/spec/controllers/spree/admin/mail_methods_controller_spec.rb +++ b/spec/controllers/spree/admin/mail_methods_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::MailMethodsController do +RSpec.describe Spree::Admin::MailMethodsController do include AuthenticationHelper before { controller_login_as_admin } diff --git a/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb b/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb index a19d2e942ef..44b595b8ab0 100644 --- a/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb +++ b/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::Orders::CustomerDetailsController, type: :controller do +RSpec.describe Spree::Admin::Orders::CustomerDetailsController, type: :controller do include AuthenticationHelper describe "#update" do diff --git a/spec/controllers/spree/admin/orders/invoices_spec.rb b/spec/controllers/spree/admin/orders/invoices_spec.rb index 2a7b3b00c1d..3eda9051a29 100644 --- a/spec/controllers/spree/admin/orders/invoices_spec.rb +++ b/spec/controllers/spree/admin/orders/invoices_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::OrdersController, type: :controller do +RSpec.describe Spree::Admin::OrdersController, type: :controller do describe "#invoice" do let!(:user) { create(:user) } let!(:enterprise_user) { create(:user) } @@ -106,7 +106,7 @@ end end -describe Spree::Admin::InvoicesController, type: :controller do +RSpec.describe Spree::Admin::InvoicesController, type: :controller do describe "#index" do let(:user) { create(:user) } let(:enterprise_user) { create(:user, enterprises: [create(:enterprise)]) } @@ -158,6 +158,10 @@ let(:distributor) { order.distributor } let(:params) { { order_id: order.number } } + before do + distributor.update_attribute(:abn, "123412341234") + end + context "as a normal user" do before { allow(controller).to receive(:spree_current_user) { user } } @@ -193,6 +197,22 @@ expect(response).to redirect_to spree.admin_dashboard_path end + + context "distributor didn't set an ABN" do + before do + distributor.update_attribute(:abn, "") + end + + it "should not allow me to generate a new invoice for the order" do + expect do + spree_get :generate, params + end.to change{ Invoice.count }.by(0) + + expect(response).to redirect_to spree.admin_dashboard_path + expect(flash[:error]) + .to eq "#{distributor.name} must have a valid ABN before invoices can be used." + end + end end end end diff --git a/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb b/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb index a6ed0be235a..1e3b1cf8c62 100644 --- a/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb +++ b/spec/controllers/spree/admin/orders/payments/payments_controller_refunds_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::PaymentsController, type: :controller do +RSpec.describe Spree::Admin::PaymentsController, type: :controller do include StripeHelper include StripeStubs diff --git a/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb b/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb index 6478629e481..1917294fac5 100644 --- a/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb +++ b/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::PaymentsController, type: :controller do +RSpec.describe Spree::Admin::PaymentsController, type: :controller do let!(:shop) { create(:enterprise) } let!(:user) { shop.owner } let!(:order) { create(:order, distributor: shop, state: 'complete') } diff --git a/spec/controllers/spree/admin/orders_controller_spec.rb b/spec/controllers/spree/admin/orders_controller_spec.rb index 0dc568430dc..d4dab4e0b21 100644 --- a/spec/controllers/spree/admin/orders_controller_spec.rb +++ b/spec/controllers/spree/admin/orders_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::OrdersController, type: :controller do +RSpec.describe Spree::Admin::OrdersController, type: :controller do describe "#edit" do let!(:order) { create(:order_with_totals_and_distribution, ship_address: create(:address)) } diff --git a/spec/controllers/spree/admin/overview_controller_spec.rb b/spec/controllers/spree/admin/overview_controller_spec.rb index 455f3b3ac90..cb5f218f240 100644 --- a/spec/controllers/spree/admin/overview_controller_spec.rb +++ b/spec/controllers/spree/admin/overview_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::OverviewController, type: :controller do +RSpec.describe Spree::Admin::OverviewController, type: :controller do describe "#index" do before do allow(controller).to receive(:spree_current_user).and_return(user) diff --git a/spec/controllers/spree/admin/payment_methods_controller_spec.rb b/spec/controllers/spree/admin/payment_methods_controller_spec.rb index 37569b28ec5..e6d32886037 100644 --- a/spec/controllers/spree/admin/payment_methods_controller_spec.rb +++ b/spec/controllers/spree/admin/payment_methods_controller_spec.rb @@ -7,7 +7,7 @@ class GatewayWithPassword < PaymentMethod preference :password, :string, default: "password" end - describe Admin::PaymentMethodsController, type: :controller do + RSpec.describe Admin::PaymentMethodsController, type: :controller do let(:user) { create(:user, enterprises: [create(:distributor_enterprise)]) } diff --git a/spec/controllers/spree/admin/products_controller_spec.rb b/spec/controllers/spree/admin/products_controller_spec.rb index 9dbf146f539..2e33fc3926c 100644 --- a/spec/controllers/spree/admin/products_controller_spec.rb +++ b/spec/controllers/spree/admin/products_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::ProductsController, type: :controller do +RSpec.describe Spree::Admin::ProductsController, type: :controller do describe 'bulk_update' do context "updating a product we do not have access to" do let(:s_managed) { create(:enterprise) } diff --git a/spec/controllers/spree/admin/return_authorizations_controller_spec.rb b/spec/controllers/spree/admin/return_authorizations_controller_spec.rb index d8b0a1ca423..d76ee014bd4 100644 --- a/spec/controllers/spree/admin/return_authorizations_controller_spec.rb +++ b/spec/controllers/spree/admin/return_authorizations_controller_spec.rb @@ -4,7 +4,7 @@ module Spree module Admin - describe ReturnAuthorizationsController, type: :controller do + RSpec.describe ReturnAuthorizationsController, type: :controller do include AuthenticationHelper let(:order) { create(:shipped_order, distributor: create(:distributor_enterprise)) } diff --git a/spec/controllers/spree/admin/search_controller_spec.rb b/spec/controllers/spree/admin/search_controller_spec.rb index 53313e5521f..a62e38e6b99 100644 --- a/spec/controllers/spree/admin/search_controller_spec.rb +++ b/spec/controllers/spree/admin/search_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::SearchController, type: :controller do +RSpec.describe Spree::Admin::SearchController, type: :controller do context "Distributor Enterprise User" do let!(:owner) { create(:user, email: "test1@email.com" ) } let!(:manager) { create(:user, email: "test2@email.com" ) } diff --git a/spec/controllers/spree/admin/shipping_categories_controller_spec.rb b/spec/controllers/spree/admin/shipping_categories_controller_spec.rb index 8a77bb78c65..e7df05f5f43 100644 --- a/spec/controllers/spree/admin/shipping_categories_controller_spec.rb +++ b/spec/controllers/spree/admin/shipping_categories_controller_spec.rb @@ -4,7 +4,7 @@ module Spree module Admin - describe ShippingCategoriesController, type: :controller do + RSpec.describe ShippingCategoriesController, type: :controller do include AuthenticationHelper describe "#create and #update" do diff --git a/spec/controllers/spree/admin/shipping_methods_controller_spec.rb b/spec/controllers/spree/admin/shipping_methods_controller_spec.rb index e93103e2d66..efdb46d78c5 100644 --- a/spec/controllers/spree/admin/shipping_methods_controller_spec.rb +++ b/spec/controllers/spree/admin/shipping_methods_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::ShippingMethodsController, type: :controller do +RSpec.describe Spree::Admin::ShippingMethodsController, type: :controller do include AuthenticationHelper describe "#update" do diff --git a/spec/controllers/spree/admin/tax_rates_controller_spec.rb b/spec/controllers/spree/admin/tax_rates_controller_spec.rb index 3ce91d9ebf0..ad9bc2cb72d 100644 --- a/spec/controllers/spree/admin/tax_rates_controller_spec.rb +++ b/spec/controllers/spree/admin/tax_rates_controller_spec.rb @@ -4,7 +4,7 @@ module Spree module Admin - describe TaxRatesController, type: :controller do + RSpec.describe TaxRatesController, type: :controller do include AuthenticationHelper let!(:default_tax_zone) { create(:zone, default_tax: true) } diff --git a/spec/controllers/spree/admin/tax_settings_controller_spec.rb b/spec/controllers/spree/admin/tax_settings_controller_spec.rb index dbb320b1c6a..e41d1825a43 100644 --- a/spec/controllers/spree/admin/tax_settings_controller_spec.rb +++ b/spec/controllers/spree/admin/tax_settings_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::TaxSettingsController, type: :controller do +RSpec.describe Spree::Admin::TaxSettingsController, type: :controller do describe "#update" do let(:params) { { preferences: { products_require_tax_category: "1" } } } diff --git a/spec/controllers/spree/admin/taxons_controller_spec.rb b/spec/controllers/spree/admin/taxons_controller_spec.rb index 8c19f14da86..3abc6669aa6 100644 --- a/spec/controllers/spree/admin/taxons_controller_spec.rb +++ b/spec/controllers/spree/admin/taxons_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::TaxonsController do +RSpec.describe Spree::Admin::TaxonsController do render_views let(:taxonomy) { create(:taxonomy) } diff --git a/spec/controllers/spree/admin/users_controller_spec.rb b/spec/controllers/spree/admin/users_controller_spec.rb index 96e7cc4df40..11d4b969c40 100644 --- a/spec/controllers/spree/admin/users_controller_spec.rb +++ b/spec/controllers/spree/admin/users_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::UsersController do +RSpec.describe Spree::Admin::UsersController do context '#authorize_admin' do let(:user) { create(:user) } let(:test_user) { create(:user) } diff --git a/spec/controllers/spree/admin/variants_controller_spec.rb b/spec/controllers/spree/admin/variants_controller_spec.rb index 7bdfc7bcbe7..8585415d0e2 100644 --- a/spec/controllers/spree/admin/variants_controller_spec.rb +++ b/spec/controllers/spree/admin/variants_controller_spec.rb @@ -4,7 +4,7 @@ module Spree module Admin - describe VariantsController, type: :controller do + RSpec.describe VariantsController, type: :controller do before { controller_login_as_admin } describe "#index" do diff --git a/spec/controllers/spree/api_keys_controller_spec.rb b/spec/controllers/spree/api_keys_controller_spec.rb index 99faf439641..5b3162acc0e 100644 --- a/spec/controllers/spree/api_keys_controller_spec.rb +++ b/spec/controllers/spree/api_keys_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::ApiKeysController, type: :controller, performance: true do +RSpec.describe Spree::ApiKeysController, type: :controller, performance: true do routes { Spree::Core::Engine.routes } include AuthenticationHelper diff --git a/spec/controllers/spree/credit_cards_controller_spec.rb b/spec/controllers/spree/credit_cards_controller_spec.rb index 41e87d975ca..c5163163ed6 100644 --- a/spec/controllers/spree/credit_cards_controller_spec.rb +++ b/spec/controllers/spree/credit_cards_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::CreditCardsController, type: :controller do +RSpec.describe Spree::CreditCardsController, type: :controller do describe "using VCR", :vcr, :stripe_version do let(:user) { create(:user) } diff --git a/spec/controllers/spree/orders_controller_spec.rb b/spec/controllers/spree/orders_controller_spec.rb index 78ed96e16e9..f1f47762c2e 100644 --- a/spec/controllers/spree/orders_controller_spec.rb +++ b/spec/controllers/spree/orders_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::OrdersController, type: :controller do +RSpec.describe Spree::OrdersController, type: :controller do include CheckoutHelper include StripeStubs diff --git a/spec/controllers/spree/user_sessions_controller_spec.rb b/spec/controllers/spree/user_sessions_controller_spec.rb index 34053783b7e..5f035752637 100644 --- a/spec/controllers/spree/user_sessions_controller_spec.rb +++ b/spec/controllers/spree/user_sessions_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::UserSessionsController, type: :controller do +RSpec.describe Spree::UserSessionsController, type: :controller do let(:user) { create(:user) } before do diff --git a/spec/controllers/spree/users_controller_spec.rb b/spec/controllers/spree/users_controller_spec.rb index ee8de1d00fb..6eff295eb69 100644 --- a/spec/controllers/spree/users_controller_spec.rb +++ b/spec/controllers/spree/users_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::UsersController, type: :controller do +RSpec.describe Spree::UsersController, type: :controller do routes { Spree::Core::Engine.routes } include AuthenticationHelper diff --git a/spec/controllers/stripe/callbacks_controller_spec.rb b/spec/controllers/stripe/callbacks_controller_spec.rb index de37d51cc83..b4a122620f2 100644 --- a/spec/controllers/stripe/callbacks_controller_spec.rb +++ b/spec/controllers/stripe/callbacks_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Stripe::CallbacksController, type: :controller do +RSpec.describe Stripe::CallbacksController, type: :controller do let(:enterprise) { create(:distributor_enterprise) } context "#index" do diff --git a/spec/controllers/stripe/webhooks_controller_spec.rb b/spec/controllers/stripe/webhooks_controller_spec.rb index 1369a6aa472..38ccaff7971 100644 --- a/spec/controllers/stripe/webhooks_controller_spec.rb +++ b/spec/controllers/stripe/webhooks_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Stripe::WebhooksController, type: :controller do +RSpec.describe Stripe::WebhooksController, type: :controller do describe "#create" do let(:params) do { diff --git a/spec/controllers/user_confirmations_controller_spec.rb b/spec/controllers/user_confirmations_controller_spec.rb index dd4897c4e11..d276d4c8741 100644 --- a/spec/controllers/user_confirmations_controller_spec.rb +++ b/spec/controllers/user_confirmations_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe UserConfirmationsController, type: :controller do +RSpec.describe UserConfirmationsController, type: :controller do let!(:user) { create(:user) } let!(:confirmed_user) { create(:user, confirmed_at: nil) } let!(:unconfirmed_user) { create(:user, confirmed_at: nil) } diff --git a/spec/controllers/user_passwords_controller_spec.rb b/spec/controllers/user_passwords_controller_spec.rb index 7ba17274b8c..594f5dbd79d 100644 --- a/spec/controllers/user_passwords_controller_spec.rb +++ b/spec/controllers/user_passwords_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe UserPasswordsController, type: :controller do +RSpec.describe UserPasswordsController, type: :controller do render_views let(:user) { create(:user) } diff --git a/spec/controllers/user_registrations_controller_spec.rb b/spec/controllers/user_registrations_controller_spec.rb index d25b811d694..23aa1e220a5 100644 --- a/spec/controllers/user_registrations_controller_spec.rb +++ b/spec/controllers/user_registrations_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe UserRegistrationsController, type: :controller do +RSpec.describe UserRegistrationsController, type: :controller do before do @request.env["devise.mapping"] = Devise.mappings[:spree_user] end diff --git a/spec/controllers/webhook_endpoints_controller_spec.rb b/spec/controllers/webhook_endpoints_controller_spec.rb index e628710f72b..bd6ea079614 100644 --- a/spec/controllers/webhook_endpoints_controller_spec.rb +++ b/spec/controllers/webhook_endpoints_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'open_food_network/order_cycle_permissions' -describe WebhookEndpointsController, type: :controller do +RSpec.describe WebhookEndpointsController, type: :controller do let(:user) { create(:admin_user) } before { allow(controller).to receive(:spree_current_user) { user } } diff --git a/spec/factories.rb b/spec/factories.rb index 52c80704d5e..90675a7cbbe 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -94,6 +94,11 @@ transient { amount { 1 } } calculator { build(:calculator_per_item, preferred_amount: amount) } end + + trait :flat_percent_per_item do + transient { amount { 1 } } + calculator { build(:calculator_flat_percent_per_item, preferred_flat_percent: amount) } + end end factory :adjustment_metadata, class: AdjustmentMetadata do diff --git a/spec/factories/calculator_factory.rb b/spec/factories/calculator_factory.rb index 91c571a8fe5..fd861e21ff7 100644 --- a/spec/factories/calculator_factory.rb +++ b/spec/factories/calculator_factory.rb @@ -14,6 +14,10 @@ preferred_amount { generate(:calculator_amount) } end + factory :calculator_flat_percent_per_item, class: Calculator::FlatPercentPerItem do + preferred_flat_percent { generate(:calculator_amount) } + end + factory :weight_calculator, class: Calculator::Weight do after(:build) { |c| c.set_preference(:per_unit, 0.5) diff --git a/spec/factories/payment_method_factory.rb b/spec/factories/payment_method_factory.rb index 98e8d36a35c..c93657ef21d 100644 --- a/spec/factories/payment_method_factory.rb +++ b/spec/factories/payment_method_factory.rb @@ -24,4 +24,9 @@ distributors { [FactoryBot.create(:stripe_account).enterprise] } preferred_enterprise_id { distributors.first.id } end + + factory :distributor_payment_method, class: DistributorPaymentMethod do + distributor { FactoryBot.create(:distributor_enterprise) } + payment_method { FactoryBot.create(:payment_method) } + end end diff --git a/spec/factories/shipping_method_factory.rb b/spec/factories/shipping_method_factory.rb index d6957e78bdc..68b41106c47 100644 --- a/spec/factories/shipping_method_factory.rb +++ b/spec/factories/shipping_method_factory.rb @@ -68,4 +68,9 @@ distributors { [create(:distributor_enterprise_with_tax)] } end end + + factory :distributor_shipping_method, class: DistributorShippingMethod do + shipping_method { FactoryBot.create(:shipping_method) } + distributor { FactoryBot.create(:distributor_enterprise) } + end end diff --git a/spec/fixtures/vcr_cassettes/DFC_Product_Import/imports_from_a_FDC_catalog.yml b/spec/fixtures/vcr_cassettes/DFC_Product_Import/imports_from_a_FDC_catalog.yml new file mode 100644 index 00000000000..ad4af0b09bd --- /dev/null +++ b/spec/fixtures/vcr_cassettes/DFC_Product_Import/imports_from_a_FDC_catalog.yml @@ -0,0 +1,206 @@ +--- +http_interactions: +- request: + method: post + uri: https://food-data-collaboration-produc-fe870152f634.herokuapp.com/fdc/products?shop=test-hodmedod.myshopify.com + body: + encoding: UTF-8 + string: '{"userId":"testdfc@protonmail.com","accessToken":""}' + headers: + Content-Type: + - application/json + Authorization: + - "" + User-Agent: + - Faraday v2.9.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 403 + message: Forbidden + headers: + Server: + - Cowboy + Report-To: + - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1716531220&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=GSiP%2FtCyGGyQZrjxJKzy4%2F8ZDbqeNOf8qWTTKv61%2FjQ%3D"}]}' + Reporting-Endpoints: + - heroku-nel=https://nel.heroku.com/reports?ts=1716531220&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=GSiP%2FtCyGGyQZrjxJKzy4%2F8ZDbqeNOf8qWTTKv61%2FjQ%3D + Nel: + - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' + Connection: + - keep-alive + X-Powered-By: + - Express + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '62' + Etag: + - W/"3e-3yNPCMU4MDQmKmieGPWfDcA/0Eg" + Date: + - Fri, 24 May 2024 06:13:41 GMT + Via: + - 1.1 vegur + body: + encoding: UTF-8 + string: '{"message":"User access denied","error":"User not authorized"}' + recorded_at: Fri, 24 May 2024 06:13:41 GMT +- request: + method: get + uri: https://login.lescommuns.org/auth/realms/data-food-consortium/.well-known/openid-configuration + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - SWD 2.0.3 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Date: + - Fri, 24 May 2024 06:13:42 GMT + Content-Type: + - application/json;charset=UTF-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Vary: + - Accept-Encoding + Set-Cookie: + - AUTH_SESSION_ID=1716531223.827.7041.811327|6055218c9898cae39f8ffd531999e49a; + Path=/; Secure; HttpOnly + Cache-Control: + - no-cache, must-revalidate, no-transform, no-store + Referrer-Policy: + - no-referrer + Strict-Transport-Security: + - max-age=15724800; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + body: + encoding: ASCII-8BIT + string: '{"issuer":"https://login.lescommuns.org/auth/realms/data-food-consortium","authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth","token_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token","introspection_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token/introspect","userinfo_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/userinfo","end_session_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/logout","frontchannel_logout_session_supported":true,"frontchannel_logout_supported":true,"jwks_uri":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/certs","check_session_iframe":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/login-status-iframe.html","grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials","urn:openid:params:grant-type:ciba","urn:ietf:params:oauth:grant-type:device_code"],"acr_values_supported":["0","1"],"response_types_supported":["code","none","id_token","token","id_token + token","code id_token","code token","code id_token token"],"subject_types_supported":["public","pairwise"],"id_token_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"id_token_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"id_token_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"userinfo_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"userinfo_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"userinfo_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"request_object_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"request_object_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"request_object_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"response_modes_supported":["query","fragment","form_post","query.jwt","fragment.jwt","form_post.jwt","jwt"],"registration_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/clients-registrations/openid-connect","token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"token_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"introspection_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"introspection_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"authorization_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"authorization_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"authorization_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"claims_supported":["aud","sub","iss","auth_time","name","given_name","family_name","preferred_username","email","acr"],"claim_types_supported":["normal"],"claims_parameter_supported":true,"scopes_supported":["openid","microprofile-jwt","phone","roles","profile","email","address","web-origins","acr","offline_access"],"request_parameter_supported":true,"request_uri_parameter_supported":true,"require_request_uri_registration":true,"code_challenge_methods_supported":["plain","S256"],"tls_client_certificate_bound_access_tokens":true,"revocation_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/revoke","revocation_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"revocation_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"backchannel_logout_supported":true,"backchannel_logout_session_supported":true,"device_authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth/device","backchannel_token_delivery_modes_supported":["poll","ping"],"backchannel_authentication_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/ciba/auth","backchannel_authentication_request_signing_alg_values_supported":["PS384","ES384","RS384","ES256","RS256","ES512","PS256","PS512","RS512"],"require_pushed_authorization_requests":false,"pushed_authorization_request_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/par/request","mtls_endpoint_aliases":{"token_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token","revocation_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/revoke","introspection_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token/introspect","device_authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth/device","registration_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/clients-registrations/openid-connect","userinfo_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/userinfo","pushed_authorization_request_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/par/request","backchannel_authentication_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/ciba/auth"},"authorization_response_iss_parameter_supported":true}' + recorded_at: Fri, 24 May 2024 06:13:43 GMT +- request: + method: post + uri: https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token + body: + encoding: UTF-8 + string: grant_type=refresh_token&refresh_token= + headers: + User-Agent: + - Rack::OAuth2 (2.2.1) + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Date: + - Fri, 24 May 2024 06:13:44 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Vary: + - Accept-Encoding + Set-Cookie: + - AUTH_SESSION_ID=1716531225.15.7041.192535|6055218c9898cae39f8ffd531999e49a; + Path=/; Secure; HttpOnly + Cache-Control: + - no-store + Pragma: + - no-cache + Referrer-Policy: + - no-referrer + Strict-Transport-Security: + - max-age=15724800; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + body: + encoding: ASCII-8BIT + string: '{"access_token":"","expires_in":1800,"refresh_expires_in":31357813,"refresh_token":"","token_type":"Bearer","id_token":"","not-before-policy":0,"session_state":"cfaa4a60-c2aa-4590-9fdf-a117f23d564f","scope":"openid + profile email"}' + recorded_at: Fri, 24 May 2024 06:13:44 GMT +- request: + method: post + uri: https://food-data-collaboration-produc-fe870152f634.herokuapp.com/fdc/products?shop=test-hodmedod.myshopify.com + body: + encoding: UTF-8 + string: '{"userId":"testdfc@protonmail.com","accessToken":""}' + headers: + Content-Type: + - application/json + Authorization: + - "" + User-Agent: + - Faraday v2.9.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - Cowboy + Report-To: + - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1716531225&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=zHpdjRNvPwW4u7pYofDRsdOcjztCveqnM3K9GcGjhMU%3D"}]}' + Reporting-Endpoints: + - heroku-nel=https://nel.heroku.com/reports?ts=1716531225&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=zHpdjRNvPwW4u7pYofDRsdOcjztCveqnM3K9GcGjhMU%3D + Nel: + - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' + Connection: + - keep-alive + X-Powered-By: + - Express + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '41161' + Etag: + - W/"a0c9-f4oAeN9fidSaWKNQXG3R8vniAac" + Date: + - Fri, 24 May 2024 06:13:49 GMT + Via: + - 1.1 vegur + body: + encoding: ASCII-8BIT + string: !binary |- + eyJwcm9kdWN0cyI6IntcIkBjb250ZXh0XCI6XCJodHRwczovL3d3dy5kYXRhZm9vZGNvbnNvcnRpdW0ub3JnXCIsXCJAZ3JhcGhcIjpbe1wiQGlkXCI6XCJfOmIxXCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC40XCJ9LHtcIkBpZFwiOlwiXzpiMTBcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjIuODlcIn0se1wiQGlkXCI6XCJfOmIxMVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjAuNFwifSx7XCJAaWRcIjpcIl86YjEyXCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIwLjk5XCJ9LHtcIkBpZFwiOlwiXzpiMTNcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIwLjNcIn0se1wiQGlkXCI6XCJfOmIxNFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMi45OVwifSx7XCJAaWRcIjpcIl86YjE1XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNC44XCJ9LHtcIkBpZFwiOlwiXzpiMTZcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjE4Ljg1XCJ9LHtcIkBpZFwiOlwiXzpiMTdcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCI0LjhcIn0se1wiQGlkXCI6XCJfOmIxOFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNy40MlwifSx7XCJAaWRcIjpcIl86YjE5XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNVwifSx7XCJAaWRcIjpcIl86YjJcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjIuMDlcIn0se1wiQGlkXCI6XCJfOmIyMFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTIuNjBcIn0se1wiQGlkXCI6XCJfOmIyMVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjQuOFwifSx7XCJAaWRcIjpcIl86YjIyXCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCI4Ljc2XCJ9LHtcIkBpZFwiOlwiXzpiMjNcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIxLjA1XCJ9LHtcIkBpZFwiOlwiXzpiMjRcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjEzLjA1XCJ9LHtcIkBpZFwiOlwiXzpiMjVcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCI0LjhcIn0se1wiQGlkXCI6XCJfOmIyNlwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNi43NlwifSx7XCJAaWRcIjpcIl86YjI3XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiM1wifSx7XCJAaWRcIjpcIl86YjI4XCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIxNS45MFwifSx7XCJAaWRcIjpcIl86YjI5XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTJcIn0se1wiQGlkXCI6XCJfOmIzXCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC40XCJ9LHtcIkBpZFwiOlwiXzpiMzBcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiMzFcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxMlwifSx7XCJAaWRcIjpcIl86YjMyXCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMVwifSx7XCJAaWRcIjpcIl86YjMzXCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTBcIn0se1wiQGlkXCI6XCJfOmIzNFwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjFcIn0se1wiQGlkXCI6XCJfOmIzNVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjEyXCJ9LHtcIkBpZFwiOlwiXzpiMzZcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiMzdcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCI2XCJ9LHtcIkBpZFwiOlwiXzpiMzhcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiMzlcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxMlwifSx7XCJAaWRcIjpcIl86YjRcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjEuMTlcIn0se1wiQGlkXCI6XCJfOmI0MFwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjFcIn0se1wiQGlkXCI6XCJfOmI0MVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjEwXCJ9LHtcIkBpZFwiOlwiXzpiNDJcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiNVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjAuNVwifSx7XCJAaWRcIjpcIl86YjZcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjEuNjlcIn0se1wiQGlkXCI6XCJfOmI3XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC40XCJ9LHtcIkBpZFwiOlwiXzpiOFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMS4zOVwifSx7XCJAaWRcIjpcIl86YjlcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIwLjE3NVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzVcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmRlc2NyaXB0aW9uXCI6XCI8dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHIgc3R5bGU9XFxcImJvcmRlcjogMHB4O1xcXCI+XFxuPHRkIGJnY29sb3I9XFxcIiNkNmZiZWRcXFwiIHN0eWxlPVxcXCJjb2xvcjogIzAwMDAwMDsgYm9yZGVyOiAwcHg7XFxcIj48c3Ryb25nPlRoZXkncmUgYmFjayE8L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPlxcbjxwPjxzdHJvbmc+VGhpbmsgYmFrZWQgYmVhbnMgYXJlIEJyaXRpc2g/IFRoZXkgYXJlIG5vdyEgV2UgdXNlIG9ubHkgQnJpdGlzaC1ncm93biBmYXZhIGJlYW5zIC0gQnJpdGFpbidzIG9yaWdpbmFsIGJlYW4sIGdyb3duIGhlcmUgc2luY2UgdGhlIElyb24gQWdlLiBPdXIgQmFrZWQgQnJpdGlzaCBCZWFucyBhcmUgZGVsaWNpb3VzbHkgZGlmZmVyZW50LCB3aXRoIGxhcmdlIG1lYXR5IGZhdmEgYmVhbnMgaW4gYSB0YXN0eSB0b21hdG8gc2F1Y2UuPC9zdHJvbmc+PC9wPlxcbjxwPjxzdHJvbmc+PGEgdGl0bGU9XFxcIldoYXQgYXJlIGZhdmEgYmVhbnM/IEFyZW4ndCB0aGV5IGp1c3QgYnJvYWQgYmVhbnM/XFxcIiBocmVmPVxcXCIvYmxvZ3MvbmV3cy93aGF0LWFyZS1mYXZhLWJlYW5zLWFyZS10aGV5LWp1c3QtYnJvYWQtYmVhbnNcXFwiIGRhdGEtbWNlLWZyYWdtZW50PVxcXCIxXFxcIiBkYXRhLW1jZS1ocmVmPVxcXCIvYmxvZ3MvbmV3cy93aGF0LWFyZS1mYXZhLWJlYW5zLWFyZS10aGV5LWp1c3QtYnJvYWQtYmVhbnNcXFwiPldoYXQgYXJlIGZhdmEgYmVhbnM/IEZpbmQgb3V0IGhlcmUuLi48L2E+PC9zdHJvbmc+PC9wPlxcbjwhLS0gc3BsaXQgLS0+PGgzPkNvbXBsZXRlIFByb2R1Y3QgRGV0YWlsczwvaDM+PHA+T3VyIEJha2VkIEJyaXRpc2ggQmVhbnMgYXJlIGNvb2tlZCBhbmQgcmVhZHkgdG8gZWF0LCBob3Qgb3IgY29sZC4gVGhleSdyZSBnb29kIHNlcnZlZCBvbiB0b2FzdCBidXQgYWxzbyBkZWxpY2lvdXMgYWRkZWQgdG8gc3Rld3MsIGN1cnJpZXMgb3IgY2Fzc2Vyb2xlcy4gT3IgZXZlbiBpbiBhIHBpZS48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+Q29va2luZyBpbnN0cnVjdGlvbnM8L2g1PlxcbjxwPjxzdHJvbmc+Q29va2luZyBvbiB0aGUgSG9iPC9zdHJvbmc+PGJyPkVtcHR5IGNvbnRlbnRzIGludG8gc2F1Y2VwYW4uIEhlYXQgZ2VudGx5IGZvciA0LTUgbWludXRlcyB3aGlsZSBzdGlycmluZy4gRm9yIGJlc3QgZmxhdm91ciBkbyBub3QgYm9pbCBvciBvdmVyY29vay4gRG8gbm90IHJlaGVhdC48L3A+XFxuPHA+PHN0cm9uZz5NaWNyb3dhdmUgQ29va2luZzwvc3Ryb25nPjxicj5FbXB0eSBjb250ZW50cyBpbnRvIGEgbm9uLW1ldGFsbGljIGJvd2wgYW5kIGNvdmVyLiBIZWF0IGZvciAyIHRvIDMgbWludXRlcywgc3RpcnJpbmcgaGFsZndheS4gQ2hlY2sgdGhlIGZvb2QgaXMgaG90LCBzdGlyIHdlbGwgYW5kIHNlcnZlLiBEbyBub3QgcmVoZWF0LjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5UbyBTdG9yZTwvaDU+XFxuPHA+U3RvcmUgaW4gYSBjb29sLCBkcnkgcGxhY2UuIE9uY2Ugb3BlbmVkLCB0cmFuc2ZlciBjb250ZW50cyB0byBhIG5vbi1tZXRhbGxpYyBjb250YWluZXIsIGNvdmVyIHJlZnJpZ2VyYXRlIGFuZCB1c2Ugd2l0aCAyIGRheXMuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkluZ3JlZGllbnRzPC9oNT5cXG48cD5GYXZhIEJlYW5zIChCcm9hZCBCZWFucykgKDQyJSksIFdhdGVyLCBUb21hdG8gUHVyZWUsIFN1Z2FyLCBNb2RpZmllZCBNYWl6ZSBTdGFyY2gsIFNhbHQsIEhlcmJzICZhbXA7IFNwaWNlcywgQ29uY2VudHJhdGVkIExlbW9uIEp1aWNlPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkFsbGVyZ3kgaW5mb3JtYXRpb248L2g1PlxcbjxwPk5vIEFsbGVyZ2VuczwvcD5cXG48dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHI+XFxuPHRkPjxzdHJvbmc+VHlwaWNhbCB2YWx1ZXM8L3N0cm9uZz48L3RkPlxcbjx0ZD48c3Ryb25nPlBlciAxMDBnPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RW5lcmd5PC90ZD5cXG48dGQ+Mjkya0ogKDY5a2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4wLjRnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjEwLjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+NC42ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+NWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5Qcm90ZWluPC90ZD5cXG48dGQ+NGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5TYWx0PC90ZD5cXG48dGQ+MC42ZzwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+PGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+TW9yZTwvaDU+XFxuPHA+RGVsaWNpb3VzLCBudXRyaXRpb3VzIGFuZCBnb29kIGZvciB0aGUgc29pbCwgZmF2YSBiZWFucyBhcmUgYSB2YXJpZXR5IG9mIGJyb2FkIGJlYW4sIFZpY2lhIGZhYmEsIGxlZnQgdG8gcmlwZW4gYW5kIGRyeSBiZWZvcmUgaGFydmVzdC4gVGhleeKAmXJlIGFsc28ga25vd24gYXMgZmllbGQgYmVhbnMsIGhvcnNlIGJlYW5zLCBXaW5kc29yIGJlYW5zIG9yIGZ1bC48L3A+XFxuPHA+U3VpdGFibGUgZm9yIHZlZ2FucyBhbmQgdmVnZXRhcmlhbnM8L3A+XFxuXCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMVwiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9QYWNrLUNhbi1CYWtlZC1CZWFucy0xODAweDZfOTgzeDY1Nl81MTM3NThlNi0yNjE2LTQ2ODctYThiMi1iYTZkZGU4NjQ5MjMuanBnP3Y9MTY3Nzc2MDc3OFwiLFwiZGZjLWI6bmFtZVwiOlwiQmFrZWQgQnJpdGlzaCBCZWFucyAtIFJldGFpbCBjYW4sIDQwMGcgKGNhbilcIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiTkNCQi9UNFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjJcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpjb25zdW1lc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNVwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjI5XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjMwXCIsXCJkZmMtYjpwcm9kdWNlc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUwMDQwM1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvdHJhbnNmb3JtYXRpb25cIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRUcmFuc2Zvcm1hdGlvblwiLFwiZGZjLWI6aGFzSW5jb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmhhc091dGNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUwMDQwM1wiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6ZGVzY3JpcHRpb25cIjpcIjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0ciBzdHlsZT1cXFwiYm9yZGVyOiAwcHg7XFxcIj5cXG48dGQgYmdjb2xvcj1cXFwiI2Q2ZmJlZFxcXCIgc3R5bGU9XFxcImNvbG9yOiAjMDAwMDAwOyBib3JkZXI6IDBweDtcXFwiPjxzdHJvbmc+VGhleSdyZSBiYWNrITwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+XFxuPHA+PHN0cm9uZz5UaGluayBiYWtlZCBiZWFucyBhcmUgQnJpdGlzaD8gVGhleSBhcmUgbm93ISBXZSB1c2Ugb25seSBCcml0aXNoLWdyb3duIGZhdmEgYmVhbnMgLSBCcml0YWluJ3Mgb3JpZ2luYWwgYmVhbiwgZ3Jvd24gaGVyZSBzaW5jZSB0aGUgSXJvbiBBZ2UuIE91ciBCYWtlZCBCcml0aXNoIEJlYW5zIGFyZSBkZWxpY2lvdXNseSBkaWZmZXJlbnQsIHdpdGggbGFyZ2UgbWVhdHkgZmF2YSBiZWFucyBpbiBhIHRhc3R5IHRvbWF0byBzYXVjZS48L3N0cm9uZz48L3A+XFxuPHA+PHN0cm9uZz48YSB0aXRsZT1cXFwiV2hhdCBhcmUgZmF2YSBiZWFucz8gQXJlbid0IHRoZXkganVzdCBicm9hZCBiZWFucz9cXFwiIGhyZWY9XFxcIi9ibG9ncy9uZXdzL3doYXQtYXJlLWZhdmEtYmVhbnMtYXJlLXRoZXktanVzdC1icm9hZC1iZWFuc1xcXCIgZGF0YS1tY2UtZnJhZ21lbnQ9XFxcIjFcXFwiIGRhdGEtbWNlLWhyZWY9XFxcIi9ibG9ncy9uZXdzL3doYXQtYXJlLWZhdmEtYmVhbnMtYXJlLXRoZXktanVzdC1icm9hZC1iZWFuc1xcXCI+V2hhdCBhcmUgZmF2YSBiZWFucz8gRmluZCBvdXQgaGVyZS4uLjwvYT48L3N0cm9uZz48L3A+XFxuPCEtLSBzcGxpdCAtLT48aDM+Q29tcGxldGUgUHJvZHVjdCBEZXRhaWxzPC9oMz48cD5PdXIgQmFrZWQgQnJpdGlzaCBCZWFucyBhcmUgY29va2VkIGFuZCByZWFkeSB0byBlYXQsIGhvdCBvciBjb2xkLiBUaGV5J3JlIGdvb2Qgc2VydmVkIG9uIHRvYXN0IGJ1dCBhbHNvIGRlbGljaW91cyBhZGRlZCB0byBzdGV3cywgY3VycmllcyBvciBjYXNzZXJvbGVzLiBPciBldmVuIGluIGEgcGllLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Db29raW5nIGluc3RydWN0aW9uczwvaDU+XFxuPHA+PHN0cm9uZz5Db29raW5nIG9uIHRoZSBIb2I8L3N0cm9uZz48YnI+RW1wdHkgY29udGVudHMgaW50byBzYXVjZXBhbi4gSGVhdCBnZW50bHkgZm9yIDQtNSBtaW51dGVzIHdoaWxlIHN0aXJyaW5nLiBGb3IgYmVzdCBmbGF2b3VyIGRvIG5vdCBib2lsIG9yIG92ZXJjb29rLiBEbyBub3QgcmVoZWF0LjwvcD5cXG48cD48c3Ryb25nPk1pY3Jvd2F2ZSBDb29raW5nPC9zdHJvbmc+PGJyPkVtcHR5IGNvbnRlbnRzIGludG8gYSBub24tbWV0YWxsaWMgYm93bCBhbmQgY292ZXIuIEhlYXQgZm9yIDIgdG8gMyBtaW51dGVzLCBzdGlycmluZyBoYWxmd2F5LiBDaGVjayB0aGUgZm9vZCBpcyBob3QsIHN0aXIgd2VsbCBhbmQgc2VydmUuIERvIG5vdCByZWhlYXQuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPlRvIFN0b3JlPC9oNT5cXG48cD5TdG9yZSBpbiBhIGNvb2wsIGRyeSBwbGFjZS4gT25jZSBvcGVuZWQsIHRyYW5zZmVyIGNvbnRlbnRzIHRvIGEgbm9uLW1ldGFsbGljIGNvbnRhaW5lciwgY292ZXIgcmVmcmlnZXJhdGUgYW5kIHVzZSB3aXRoIDIgZGF5cy48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+SW5ncmVkaWVudHM8L2g1PlxcbjxwPkZhdmEgQmVhbnMgKEJyb2FkIEJlYW5zKSAoNDIlKSwgV2F0ZXIsIFRvbWF0byBQdXJlZSwgU3VnYXIsIE1vZGlmaWVkIE1haXplIFN0YXJjaCwgU2FsdCwgSGVyYnMgJmFtcDsgU3BpY2VzLCBDb25jZW50cmF0ZWQgTGVtb24gSnVpY2U8L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+QWxsZXJneSBpbmZvcm1hdGlvbjwvaDU+XFxuPHA+Tm8gQWxsZXJnZW5zPC9wPlxcbjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0cj5cXG48dGQ+PHN0cm9uZz5UeXBpY2FsIHZhbHVlczwvc3Ryb25nPjwvdGQ+XFxuPHRkPjxzdHJvbmc+UGVyIDEwMGc8L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5FbmVyZ3k8L3RkPlxcbjx0ZD4yOTJrSiAoNjlrY2FsKTwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZhdDwvdGQ+XFxuPHRkPjAuNGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5vZiB3aGljaCBzYXR1cmF0ZXM8L3RkPlxcbjx0ZD4wLjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+Q2FyYm9oeWRyYXRlPC90ZD5cXG48dGQ+MTAuMWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5vZiB3aGljaCBzdWdhcnM8L3RkPlxcbjx0ZD40LjZnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmlicmU8L3RkPlxcbjx0ZD41ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPlByb3RlaW48L3RkPlxcbjx0ZD40ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPlNhbHQ8L3RkPlxcbjx0ZD4wLjZnPC90ZD5cXG48L3RyPlxcbjwvdGJvZHk+XFxuPC90YWJsZT48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Nb3JlPC9oNT5cXG48cD5EZWxpY2lvdXMsIG51dHJpdGlvdXMgYW5kIGdvb2QgZm9yIHRoZSBzb2lsLCBmYXZhIGJlYW5zIGFyZSBhIHZhcmlldHkgb2YgYnJvYWQgYmVhbiwgVmljaWEgZmFiYSwgbGVmdCB0byByaXBlbiBhbmQgZHJ5IGJlZm9yZSBoYXJ2ZXN0LiBUaGV54oCZcmUgYWxzbyBrbm93biBhcyBmaWVsZCBiZWFucywgaG9yc2UgYmVhbnMsIFdpbmRzb3IgYmVhbnMgb3IgZnVsLjwvcD5cXG48cD5TdWl0YWJsZSBmb3IgdmVnYW5zIGFuZCB2ZWdldGFyaWFuczwvcD5cXG5cIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIxNVwiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9QYWNrLUNhbi1CYWtlZC1CZWFucy0xODAweDZfOTgzeDY1Nl81MTM3NThlNi0yNjE2LTQ2ODctYThiMi1iYTZkZGU4NjQ5MjMuanBnP3Y9MTY3Nzc2MDc3OFwiLFwiZGZjLWI6bmFtZVwiOlwiQmFrZWQgQnJpdGlzaCBCZWFucyAtIENhc2UsIDEyIHggNDAwZyAoY2FuKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzL2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUwMDQwMy9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUwMDQwMy9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOQ0JCL0NEXCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUwMDQwMy9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiMTZcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MVwiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6ZGVzY3JpcHRpb25cIjpcIjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0ciBzdHlsZT1cXFwiYm9yZGVyOiAwcHg7XFxcIj5cXG48dGQgYmdjb2xvcj1cXFwiI2Q2ZmJlZFxcXCIgc3R5bGU9XFxcImNvbG9yOiAjMDAwMDAwOyBib3JkZXI6IDBweDtcXFwiPjxzdHJvbmc+U29ycnksIHN0YW5kYXJkIGJhcmxleSBmbGFrZXMgYXJlIG5vIGxvbmdlciBhdmFpbGFibGUgYnV0IG91ciBkZWxpY2lvdXMgIE9yZ2FuaWMgTmFrZWQgQmFybGV5IEZsYWtlcyBhcmUgYmFjay48L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPjxwPk91ciByaWNoIGFuZCBtYWx0eSBiYXJsZXkgZmxha2VzIGFyZSBhIHN0b3JlIGN1cGJvYXJkIHN0YXBsZS4gT3JnYW5pY2FsbHkgZ3Jvd24gYW5kIG1pbGxlZCBpbiB0aGUgVUssIHRoZXkgYWRkIHRleHR1cmUgdG8gZmxhcGphY2sgYW5kIGJpc2N1aXQgcmVjaXBlcywgb3IgdG8gbWFrZSBhIGhlYXJ0aWVyLCBydXN0aWMgcG9ycmlkZ2Ug4oCTIHRyeSBibGVuZGluZyB3aXRoIG91ciBvdGhlciBmbGFrZXM8L3A+XFxuPCEtLSBzcGxpdCAtLT48aDM+Q29tcGxldGUgUHJvZHVjdCBEZXRhaWxzPC9oMz48bGkgaWQ9XFxcInRhYjFcXFwiIGNsYXNzPVxcXCJhY3RpdmVcXFwiPlxcbjxwPkJhcmxleSBmbGFrZXMgYXJlIGdyZWF0IGFkZGVkIHRvIG11ZXNsaSBvciBncmFub2xhLCBvciB1c2VkIGluIGJha2luZyBhcyBhIHRvcHBpbmcgb3IgbWl4ZWQgaW50byBkb3VnaC4gRWF0IHRoZW0gYXMgYSBjZXJlYWwsIGJha2Ugd2l0aCB0aGVtLCBvciBhZGQgdGhlbSB0byBzb3VwcyBhbmQgc3Rld3MgdG8gdGhpY2tlbiwgYm9vc3QgdGhlaXIgbnV0cml0aW9uIGFuZCBhZGQgZmxhdm91ci48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+Q29va2luZyBpbnN0cnVjdGlvbnM8L2g1PlxcbjxwPlRvIGVhdCBhcyBhIG11ZXNsaSwgY29tYmluZSB3aXRoIG90aGVyIGNlcmVhbCBmbGFrZXMgYW5kIGVuam95LiBPciB1c2UgYXMgYW4gb2F0IHN1YnN0aXR1dGUgaW4gYW55IGJha2luZyByZWNpcGUuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkluZ3JlZGllbnRzPC9oNT5cXG48cD48Yj5CYXJsZXnCoDwvYj5GbGFrZXM8L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+QWxsZXJneSBpbmZvcm1hdGlvbjwvaDU+XFxuPHA+Rm9yIGFsbGVyZ2VucywgaW5jbHVkaW5nIGNlcmVhbHMgY29udGFpbmluZyBnbHV0ZW4sIHNlZSBpbmdyZWRpZW50cyBpbiA8c3Ryb25nPmJvbGQ8L3N0cm9uZz48L3A+XFxuPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyPlxcbjx0ZD48c3Ryb25nPlR5cGljYWwgdmFsdWVzPC9zdHJvbmc+PC90ZD5cXG48dGQ+PHN0cm9uZz5QZXIgMTAwZzwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkVuZXJneTwvdGQ+XFxuPHRkPjEsNDAxa0ogKDMzMmtjYWwpPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmF0PC90ZD5cXG48dGQ+Mi4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHNhdHVyYXRlczwvdGQ+XFxuPHRkPjAuMGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5DYXJib2h5ZHJhdGU8L3RkPlxcbjx0ZD41OC4zZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHN1Z2FyczwvdGQ+XFxuPHRkPjEuN2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GaWJyZTwvdGQ+XFxuPHRkPjE3LjNnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+UHJvdGVpbjwvdGQ+XFxuPHRkPjExLjRnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+U2FsdDwvdGQ+XFxuPHRkPjAuMGc8L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPk1vcmU8L2g1Plxcbjx1bD5cXG48bGk+U3VpdGFibGUgZm9yIHZlZ2FucyBhbmQgdmVnZXRhcmlhbnNcXG48L2xpPlxcbjxsaT5ObyBhcnRpZmljaWFsIGluZ3JlZGllbnRzXFxuPC9saT5cXG48bGk+R00gZnJlZVxcbjwvbGk+XFxuPGxpPkhpZ2ggRmlicmVcXG48L2xpPlxcbjwvdWw+XFxuPC9saT5cIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI1XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL0JhcmxleS1GbGFrZXMtMjQwMHgxNjAwX2MxMjE0MDdjLTZmZDItNDZjYS1hMTI0LWRiNWRmOTQ0MjM2OC5qcGc/dj0xNjc3NzYwNzgxXCIsXCJkZmMtYjpuYW1lXCI6XCJCYXJsZXkgRmxha2VzLCBPcmdhbmljIC0gUmV0YWlsIHBhY2ssIDUwMGdcIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiT0tCQVI1XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNlwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTMzMTcxL3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTMzMTcxXCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMzNcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTMzMTcxL3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMzRcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpkZXNjcmlwdGlvblwiOlwiPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyIHN0eWxlPVxcXCJib3JkZXI6IDBweDtcXFwiPlxcbjx0ZCBiZ2NvbG9yPVxcXCIjZDZmYmVkXFxcIiBzdHlsZT1cXFwiY29sb3I6ICMwMDAwMDA7IGJvcmRlcjogMHB4O1xcXCI+PHN0cm9uZz5Tb3JyeSwgc3RhbmRhcmQgYmFybGV5IGZsYWtlcyBhcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZSBidXQgb3VyIGRlbGljaW91cyAgT3JnYW5pYyBOYWtlZCBCYXJsZXkgRmxha2VzIGFyZSBiYWNrLjwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+PHA+T3VyIHJpY2ggYW5kIG1hbHR5IGJhcmxleSBmbGFrZXMgYXJlIGEgc3RvcmUgY3VwYm9hcmQgc3RhcGxlLiBPcmdhbmljYWxseSBncm93biBhbmQgbWlsbGVkIGluIHRoZSBVSywgdGhleSBhZGQgdGV4dHVyZSB0byBmbGFwamFjayBhbmQgYmlzY3VpdCByZWNpcGVzLCBvciB0byBtYWtlIGEgaGVhcnRpZXIsIHJ1c3RpYyBwb3JyaWRnZSDigJMgdHJ5IGJsZW5kaW5nIHdpdGggb3VyIG90aGVyIGZsYWtlczwvcD5cXG48IS0tIHNwbGl0IC0tPjxoMz5Db21wbGV0ZSBQcm9kdWN0IERldGFpbHM8L2gzPjxsaSBpZD1cXFwidGFiMVxcXCIgY2xhc3M9XFxcImFjdGl2ZVxcXCI+XFxuPHA+QmFybGV5IGZsYWtlcyBhcmUgZ3JlYXQgYWRkZWQgdG8gbXVlc2xpIG9yIGdyYW5vbGEsIG9yIHVzZWQgaW4gYmFraW5nIGFzIGEgdG9wcGluZyBvciBtaXhlZCBpbnRvIGRvdWdoLiBFYXQgdGhlbSBhcyBhIGNlcmVhbCwgYmFrZSB3aXRoIHRoZW0sIG9yIGFkZCB0aGVtIHRvIHNvdXBzIGFuZCBzdGV3cyB0byB0aGlja2VuLCBib29zdCB0aGVpciBudXRyaXRpb24gYW5kIGFkZCBmbGF2b3VyLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Db29raW5nIGluc3RydWN0aW9uczwvaDU+XFxuPHA+VG8gZWF0IGFzIGEgbXVlc2xpLCBjb21iaW5lIHdpdGggb3RoZXIgY2VyZWFsIGZsYWtlcyBhbmQgZW5qb3kuIE9yIHVzZSBhcyBhbiBvYXQgc3Vic3RpdHV0ZSBpbiBhbnkgYmFraW5nIHJlY2lwZS48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+SW5ncmVkaWVudHM8L2g1PlxcbjxwPjxiPkJhcmxlecKgPC9iPkZsYWtlczwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5BbGxlcmd5IGluZm9ybWF0aW9uPC9oNT5cXG48cD5Gb3IgYWxsZXJnZW5zLCBpbmNsdWRpbmcgY2VyZWFscyBjb250YWluaW5nIGdsdXRlbiwgc2VlIGluZ3JlZGllbnRzIGluIDxzdHJvbmc+Ym9sZDwvc3Ryb25nPjwvcD5cXG48dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHI+XFxuPHRkPjxzdHJvbmc+VHlwaWNhbCB2YWx1ZXM8L3N0cm9uZz48L3RkPlxcbjx0ZD48c3Ryb25nPlBlciAxMDBnPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RW5lcmd5PC90ZD5cXG48dGQ+MSw0MDFrSiAoMzMya2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4yLjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC4wZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjU4LjNnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+MS43ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+MTcuM2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5Qcm90ZWluPC90ZD5cXG48dGQ+MTEuNGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5TYWx0PC90ZD5cXG48dGQ+MC4wZzwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+TW9yZTwvaDU+XFxuPHVsPlxcbjxsaT5TdWl0YWJsZSBmb3IgdmVnYW5zIGFuZCB2ZWdldGFyaWFuc1xcbjwvbGk+XFxuPGxpPk5vIGFydGlmaWNpYWwgaW5ncmVkaWVudHNcXG48L2xpPlxcbjxsaT5HTSBmcmVlXFxuPC9saT5cXG48bGk+SGlnaCBGaWJyZVxcbjwvbGk+XFxuPC91bD5cXG48L2xpPlwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjE5XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL0JhcmxleS1GbGFrZXMtMjQwMHgxNjAwX2MxMjE0MDdjLTZmZDItNDZjYS1hMTI0LWRiNWRmOTQ0MjM2OC5qcGc/dj0xNjc3NzYwNzgxXCIsXCJkZmMtYjpuYW1lXCI6XCJCYXJsZXkgRmxha2VzLCBPcmdhbmljIC0gU3RhbmRhcmQgY2FzZSwgMTAgeCA1MDBnXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1NjU5MzkvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5L2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5L29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk9LQkFDWFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1NjU5Mzkvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjIwXCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzNDg5MTVcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmRlc2NyaXB0aW9uXCI6XCI8cD48c3Ryb25nPkZlcm1lbnRlZCB3aG9sZWdyYWluIG5ha2VkIGJhcmxleSzCoHRhc3R5IGFuZCBzdWNjdWxlbnTCoGdyYWlucyBvZiByaWNoIG1hbHR5IHVtYW1pIGZsYXZvdXIuPC9zdHJvbmc+PC9wPlxcbjxwPlRoZXNlIHdob2xlIGZlcm1lbnRlZCBiYXJsZXnCoGdyYWlucyBhcmUgcGFja2VkIHdpdGggZGVlcCBmbGF2b3VyIGFuZCBtYWtlIGEgZGVsaWNpb3VzIGFkZGl0aW9uIHRvIGJyZWFkLCByaXNvdHRvLCBzdGV3cywgc2FsYWRzIGFuZCBtb3JlLjwvcD5cXG48IS0tIHNwbGl0IC0tPjxoMz5Db21wbGV0ZSBQcm9kdWN0IERldGFpbHM8L2gzPlxcbjxwPkFkZCBpbnRlbnNlbHkgZmxhdm91cmVkIG1hbHR5IGFuZCBzdWNjdWxlbnQgZ3JhaW5zwqBmdWxsIG9mIHVtYW1pIHJpY2huZXNzIHRvIGJyZWFkcywgcmlzb3R0bywgc3Rld3MsIHNvdXBzLCBhbmQgZXZlbiBzYWxhZHMuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkNvb2tpbmcgaW5zdHJ1Y3Rpb25zPC9oNT5cXG48cD5BZGQgYWJvdXQgaGFsZiBhIHRlYXNwb29uIHBlciBzZXJ2aW5nIHRvIGFsbW9zdCBhbnkgZGlzaCBmb3IgYWRkZWQgZGVwdGgsIHVtYW1pIHJpY2huZXNzIGFuZCBtYWx0eSBmbGF2b3VyLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5UbyBzdG9yZTwvaDU+XFxuPHA+S2VlcCByZWZyaWdlcmF0ZWQgYW5kIHVzZSB3aXRoaW4gNCB3ZWVrcyBvZiBvcGVuaW5nLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5JbmdyZWRpZW50czwvaDU+XFxuPHA+TmFrZWQgPHN0cm9uZz5CYXJsZXk8L3N0cm9uZz4sIFdhdGVyLCA8c3Ryb25nPldoZWF0PC9zdHJvbmc+IEZsb3VyLCBTYWx0LCBMaXZlIEN1bHR1cmVzKjxicj4gKjxlbT5MYWN0b2JhY2lsbHVzIGRlbGJydWVja2lpPC9lbT4sIDxlbT5Bc3BlcmdpbGx1cyBzb2phZTwvZW0+LCA8ZW0+Wnlnb3NhY2NoYXJvbXljZXMgcm91eGlpPC9lbT48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+QWxsZXJneSBpbmZvcm1hdGlvbjwvaDU+XFxuPHA+Q29udGFpbnMgPHN0cm9uZz5CYXJsZXkgKEdsdXRlbik8L3N0cm9uZz4sPHN0cm9uZz4gV2hlYXQgKEdsdXRlbik8L3N0cm9uZz48L3A+XFxuPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyPlxcbjx0ZD48c3Ryb25nPlR5cGljYWwgdmFsdWVzPC9zdHJvbmc+PC90ZD5cXG48dGQ+PHN0cm9uZz5QZXIgMTAwZzwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkVuZXJneTwvdGQ+XFxuPHRkPjUwMGtKICgxMTlrY2FsKTwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZhdDwvdGQ+XFxuPHRkPjEuN2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5vZiB3aGljaCBzYXR1cmF0ZXM8L3RkPlxcbjx0ZD4wLjVnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+Q2FyYm9oeWRyYXRlPC90ZD5cXG48dGQ+MTkuMWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5vZiB3aGljaCBzdWdhcnM8L3RkPlxcbjx0ZD4yLjdnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmlicmU8L3RkPlxcbjx0ZD41LjJnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+UHJvdGVpbjwvdGQ+XFxuPHRkPjQuMmc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5TYWx0PC90ZD5cXG48dGQ+OC41ZzwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+PGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+TW9yZTwvaDU+XFxuPHA+T3VyIEZlcm1lbnRlZCBXaG9sZWdyYWluIE5ha2VkIEJhcmxleSBpcyBmZXJtZW50ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIG1hbnkgc295YSBmZXJtZW50cyB1c2VkIGZvciBibGFjayBiZWFucywgYnV0IHVzaW5nwqBuYWtlZCBiYXJsZXkgZ3JhaW4gaW5zdGVhZCBvZiBzb3kgYmVhbnMuIEl0J3MgbWFkZSB3aXRoIGp1c3QgbmFrZWQgYmFybGV5IGdyYWlucywgd2F0ZXIgYW5kIHNhbHQsIGZlcm1lbnRlZCB3aXRoIGEgbGl2ZSBjdWx0dXJlIG9mIDxlbT5MYWN0b2JhY2lsbHVzIGRlbGJydWVja2lpPC9lbT4sIDxlbT5Bc3BlcmdpbGx1cyBzb2phZTwvZW0+IGFuZCA8ZW0+Wnlnb3NhY2NoYXJvbXljZXMgcm91eGlpPC9lbT4uPC9wPlxcbjxwPlN1aXRhYmxlIGZvciB2ZWdhbnMuPC9wPlxcbjxwPlBhY2tlZCBpbiByZWN5Y2xhYmxlIGdsYXNzIGphciB3aXRoIG1ldGFsIGxpZC48L3A+XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiOVwiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9GZXJtZW50ZWQtV2hvbGVncmFpbi1OYWtlZC1CYXJsZXktU3Bvb24tMTYwMHgxMDAwX2Q2ZmVhMDkyLWZkZTQtNGE5OC1iZWM4LWJiM2NhMGExZmQ0ZC5qcGc/dj0xNjc3NzYwODYwXCIsXCJkZmMtYjpuYW1lXCI6XCJGZXJtZW50ZWQgTmFrZWQgQmFybGV5IC0gUmV0YWlsIGphciwgMTc1ZyAoamFyKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOTU5CL0pGXCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiMTBcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpjb25zdW1lc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNVwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjM3XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjM4XCIsXCJkZmMtYjpwcm9kdWNlc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4M1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzNDg5MTUvdHJhbnNmb3JtYXRpb25cIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRUcmFuc2Zvcm1hdGlvblwiLFwiZGZjLWI6aGFzSW5jb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmhhc091dGNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzNDg5MTUvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4M1wiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6ZGVzY3JpcHRpb25cIjpcIjxwPjxzdHJvbmc+RmVybWVudGVkIHdob2xlZ3JhaW4gbmFrZWQgYmFybGV5LMKgdGFzdHkgYW5kIHN1Y2N1bGVudMKgZ3JhaW5zIG9mIHJpY2ggbWFsdHkgdW1hbWkgZmxhdm91ci48L3N0cm9uZz48L3A+XFxuPHA+VGhlc2Ugd2hvbGUgZmVybWVudGVkIGJhcmxlecKgZ3JhaW5zIGFyZSBwYWNrZWQgd2l0aCBkZWVwIGZsYXZvdXIgYW5kIG1ha2UgYSBkZWxpY2lvdXMgYWRkaXRpb24gdG8gYnJlYWQsIHJpc290dG8sIHN0ZXdzLCBzYWxhZHMgYW5kIG1vcmUuPC9wPlxcbjwhLS0gc3BsaXQgLS0+PGgzPkNvbXBsZXRlIFByb2R1Y3QgRGV0YWlsczwvaDM+XFxuPHA+QWRkIGludGVuc2VseSBmbGF2b3VyZWQgbWFsdHkgYW5kIHN1Y2N1bGVudCBncmFpbnPCoGZ1bGwgb2YgdW1hbWkgcmljaG5lc3MgdG8gYnJlYWRzLCByaXNvdHRvLCBzdGV3cywgc291cHMsIGFuZCBldmVuIHNhbGFkcy48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+Q29va2luZyBpbnN0cnVjdGlvbnM8L2g1PlxcbjxwPkFkZCBhYm91dCBoYWxmIGEgdGVhc3Bvb24gcGVyIHNlcnZpbmcgdG8gYWxtb3N0IGFueSBkaXNoIGZvciBhZGRlZCBkZXB0aCwgdW1hbWkgcmljaG5lc3MgYW5kIG1hbHR5IGZsYXZvdXIuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPlRvIHN0b3JlPC9oNT5cXG48cD5LZWVwIHJlZnJpZ2VyYXRlZCBhbmQgdXNlIHdpdGhpbiA0IHdlZWtzIG9mIG9wZW5pbmcuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkluZ3JlZGllbnRzPC9oNT5cXG48cD5OYWtlZCA8c3Ryb25nPkJhcmxleTwvc3Ryb25nPiwgV2F0ZXIsIDxzdHJvbmc+V2hlYXQ8L3N0cm9uZz4gRmxvdXIsIFNhbHQsIExpdmUgQ3VsdHVyZXMqPGJyPiAqPGVtPkxhY3RvYmFjaWxsdXMgZGVsYnJ1ZWNraWk8L2VtPiwgPGVtPkFzcGVyZ2lsbHVzIHNvamFlPC9lbT4sIDxlbT5aeWdvc2FjY2hhcm9teWNlcyByb3V4aWk8L2VtPjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5BbGxlcmd5IGluZm9ybWF0aW9uPC9oNT5cXG48cD5Db250YWlucyA8c3Ryb25nPkJhcmxleSAoR2x1dGVuKTwvc3Ryb25nPiw8c3Ryb25nPiBXaGVhdCAoR2x1dGVuKTwvc3Ryb25nPjwvcD5cXG48dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHI+XFxuPHRkPjxzdHJvbmc+VHlwaWNhbCB2YWx1ZXM8L3N0cm9uZz48L3RkPlxcbjx0ZD48c3Ryb25nPlBlciAxMDBnPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RW5lcmd5PC90ZD5cXG48dGQ+NTAwa0ogKDExOWtjYWwpPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmF0PC90ZD5cXG48dGQ+MS43ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHNhdHVyYXRlczwvdGQ+XFxuPHRkPjAuNWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5DYXJib2h5ZHJhdGU8L3RkPlxcbjx0ZD4xOS4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHN1Z2FyczwvdGQ+XFxuPHRkPjIuN2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GaWJyZTwvdGQ+XFxuPHRkPjUuMmc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5Qcm90ZWluPC90ZD5cXG48dGQ+NC4yZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPlNhbHQ8L3RkPlxcbjx0ZD44LjVnPC90ZD5cXG48L3RyPlxcbjwvdGJvZHk+XFxuPC90YWJsZT48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Nb3JlPC9oNT5cXG48cD5PdXIgRmVybWVudGVkIFdob2xlZ3JhaW4gTmFrZWQgQmFybGV5IGlzIGZlcm1lbnRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgbWFueSBzb3lhIGZlcm1lbnRzIHVzZWQgZm9yIGJsYWNrIGJlYW5zLCBidXQgdXNpbmfCoG5ha2VkIGJhcmxleSBncmFpbiBpbnN0ZWFkIG9mIHNveSBiZWFucy4gSXQncyBtYWRlIHdpdGgganVzdCBuYWtlZCBiYXJsZXkgZ3JhaW5zLCB3YXRlciBhbmQgc2FsdCwgZmVybWVudGVkIHdpdGggYSBsaXZlIGN1bHR1cmUgb2YgPGVtPkxhY3RvYmFjaWxsdXMgZGVsYnJ1ZWNraWk8L2VtPiwgPGVtPkFzcGVyZ2lsbHVzIHNvamFlPC9lbT4gYW5kIDxlbT5aeWdvc2FjY2hhcm9teWNlcyByb3V4aWk8L2VtPi48L3A+XFxuPHA+U3VpdGFibGUgZm9yIHZlZ2Fucy48L3A+XFxuPHA+UGFja2VkIGluIHJlY3ljbGFibGUgZ2xhc3MgamFyIHdpdGggbWV0YWwgbGlkLjwvcD5cIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIyM1wiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9GZXJtZW50ZWQtV2hvbGVncmFpbi1OYWtlZC1CYXJsZXktU3Bvb24tMTYwMHgxMDAwX2Q2ZmVhMDkyLWZkZTQtNGE5OC1iZWM4LWJiM2NhMGExZmQ0ZC5qcGc/dj0xNjc3NzYwODYwXCIsXCJkZmMtYjpuYW1lXCI6XCJGZXJtZW50ZWQgTmFrZWQgQmFybGV5IC0gQ2FzZSwgNiB4IDE3NWcgKGphcilcIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4My9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzODE2ODMvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzODE2ODMvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiTk1OQi9DNlwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzODE2ODMvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjI0XCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNDQ4NTFcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIxN1wiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9QYWNrLUNhbi1CYWtlZC1CZWFucy0xODAweDZfYTRkNTg0NTktYmY1Mi00OGE5LWJhZTctODA3ZjQwMzViODdmLmpwZz92PTE2Nzc3NjA3NzdcIixcImRmYy1iOm5hbWVcIjpcIkJha2VkIEJyaXRpc2ggQmVhbnMgKFRvTCkgLSBDYXNlIC0gMTIgeCA0MDBnIGNhbnNcIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNDQ4NTEvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNDQ4NTEvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiTkNCQkNEXCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiMThcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOVwiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjNcIixcImRmYy1iOmltYWdlXCI6XCJodHRwczovL2Nkbi5zaG9waWZ5LmNvbS9zL2ZpbGVzLzEvMDczMS84NDgzLzc5MzkvcHJvZHVjdHMvUGFjay1DYW4tQmFrZWQtQmVhbnMtMTgwMHg2X2E0ZDU4NDU5LWJmNTItNDhhOS1iYWU3LTgwN2Y0MDM1Yjg3Zi5qcGc/dj0xNjc3NzYwNzc3XCIsXCJkZmMtYjpuYW1lXCI6XCJCYWtlZCBCcml0aXNoIEJlYW5zIChUb0wpIC0gU2luZ2xlIC0gNDAwZyBjYW5cIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiTkNCQlQ0XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIjIwXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3Mjc3NjE5L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3Mjc3NjE5XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMzFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3Mjc3NjE5L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMzJcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3MjQ0ODUxXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMjVcIixcImRmYy1iOmltYWdlXCI6XCJodHRwczovL2Nkbi5zaG9waWZ5LmNvbS9zL2ZpbGVzLzEvMDczMS84NDgzLzc5MzkvcHJvZHVjdHMvV2hvbGUtRmF2YS1CZWFucy1PcmdhbmljLUNhbm5lZF9mY2I2NGZkNy04Y2EzLTQ2NWEtOGY1Ni00NDNjZjI4ZTBiNzEuanBnP3Y9MTY3Nzc2MDk3N1wiLFwiZGZjLWI6bmFtZVwiOlwiT3JnYW5pYyBXaG9sZSBGYXZhIEJlYW5zIGluIFdhdGVyIChUb0wpIC0gQ2FzZSAtIDEyIHggNDAwZyBjYW5zXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg3ODQ5NDcvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3L2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3L29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk9DRkJDRFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg3ODQ5NDcvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjI2XCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTVcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIxMVwiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9XaG9sZS1GYXZhLUJlYW5zLU9yZ2FuaWMtQ2FubmVkX2ZjYjY0ZmQ3LThjYTMtNDY1YS04ZjU2LTQ0M2NmMjhlMGI3MS5qcGc/dj0xNjc3NzYwOTc3XCIsXCJkZmMtYjpuYW1lXCI6XCJPcmdhbmljIFdob2xlIEZhdmEgQmVhbnMgaW4gV2F0ZXIgKFRvTCkgLSBTaW5nbGUgLSA0MDBnIGNhblwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1L2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJPQ0ZCVDRcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmIxMlwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMzlcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNDBcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTUvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiN1wiLFwiZGZjLWI6bmFtZVwiOlwiQ2FybGluIFBlYXMgaW4gV2F0ZXIsIE9yZ2FuaWMgKERJU1RSSUJVVE9SKSAtIFJldGFpbCBjYW4gKDQwMGcgY2FuKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY1NDA0OTA3NS9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY1NDA0OTA3NS9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJPQ0NQVDRcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI4XCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6Y29uc3VtZXNcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzVcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIzNVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIzNlwiLFwiZGZjLWI6cHJvZHVjZXNcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDNcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L3RyYW5zZm9ybWF0aW9uXCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkVHJhbnNmb3JtYXRpb25cIixcImRmYy1iOmhhc0luY29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY1NDA0OTA3NS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpoYXNPdXRjb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDNcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIyMVwiLFwiZGZjLWI6bmFtZVwiOlwiQ2FybGluIFBlYXMgaW4gV2F0ZXIsIE9yZ2FuaWMgKERJU1RSSUJVVE9SKSAtIFN0YW5kYXJkIGNhc2UgKDEyIHggNDAwZyBjYW4pXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDMvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDgxODQzL2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDgxODQzL29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk9DQ1BDRFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDMvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjIyXCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM1ODQ1NjNcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmIxM1wiLFwiZGZjLWI6bmFtZVwiOlwiUm9hc3RlZCBGYXZhIEJlYW5zLCBMaWdodGx5IFNlYSBTYWx0ZWQgKERJU1RSSUJVVE9SKSAtIFJldGFpbCBwYWNrICgzMDBnKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOUkZTUjNcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmIxNFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzXCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNDFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNDJcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM1ODQ1NjMvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxXCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiMjdcIixcImRmYy1iOm5hbWVcIjpcIlJvYXN0ZWQgRmF2YSBCZWFucywgTGlnaHRseSBTZWEgU2FsdGVkIChESVNUUklCVVRPUikgLSBTdGFuZGFyZCBjYXNlICgxMCB4IDMwMGcpXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM2MTczMzEvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxL2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxL29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk5SRlNDWFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM2MTczMzEvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjI4XCJ9fV19IiwibGFzdElkIjoiODE0NzI5MjI1ODYxMSIsInJlbWFpbmluZ1Byb2R1Y3RzQ291bnRBZnRlciI6MCwic3VjY2VzcyI6dHJ1ZSwibWVzc2FnZSI6IlByb2R1Y3RzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkifQ== + recorded_at: Fri, 24 May 2024 06:13:50 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/FdcRequest/refreshes_the_access_token_and_retrieves_a_catalog.yml b/spec/fixtures/vcr_cassettes/FdcRequest/refreshes_the_access_token_and_retrieves_a_catalog.yml new file mode 100644 index 00000000000..636e0616907 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/FdcRequest/refreshes_the_access_token_and_retrieves_a_catalog.yml @@ -0,0 +1,206 @@ +--- +http_interactions: +- request: + method: post + uri: https://food-data-collaboration-produc-fe870152f634.herokuapp.com/fdc/products?shop=test-hodmedod.myshopify.com + body: + encoding: UTF-8 + string: '{"userId":"testdfc@protonmail.com","accessToken":null}' + headers: + Content-Type: + - application/json + Authorization: + - "" + User-Agent: + - Faraday v2.9.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 403 + message: Forbidden + headers: + Server: + - Cowboy + Report-To: + - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1716515324&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=QHSHL9RlLovwwwatlK4mrZMZ6powGfrf8MG7QDavBV4%3D"}]}' + Reporting-Endpoints: + - heroku-nel=https://nel.heroku.com/reports?ts=1716515324&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=QHSHL9RlLovwwwatlK4mrZMZ6powGfrf8MG7QDavBV4%3D + Nel: + - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' + Connection: + - keep-alive + X-Powered-By: + - Express + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '62' + Etag: + - W/"3e-3yNPCMU4MDQmKmieGPWfDcA/0Eg" + Date: + - Fri, 24 May 2024 01:48:44 GMT + Via: + - 1.1 vegur + body: + encoding: UTF-8 + string: '{"message":"User access denied","error":"User not authorized"}' + recorded_at: Fri, 24 May 2024 01:48:44 GMT +- request: + method: get + uri: https://login.lescommuns.org/auth/realms/data-food-consortium/.well-known/openid-configuration + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - SWD 2.0.3 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Date: + - Fri, 24 May 2024 01:48:46 GMT + Content-Type: + - application/json;charset=UTF-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Vary: + - Accept-Encoding + Set-Cookie: + - AUTH_SESSION_ID=1716515327.317.9431.725800|6055218c9898cae39f8ffd531999e49a; + Path=/; Secure; HttpOnly + Cache-Control: + - no-cache, must-revalidate, no-transform, no-store + Referrer-Policy: + - no-referrer + Strict-Transport-Security: + - max-age=15724800; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + body: + encoding: ASCII-8BIT + string: '{"issuer":"https://login.lescommuns.org/auth/realms/data-food-consortium","authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth","token_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token","introspection_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token/introspect","userinfo_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/userinfo","end_session_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/logout","frontchannel_logout_session_supported":true,"frontchannel_logout_supported":true,"jwks_uri":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/certs","check_session_iframe":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/login-status-iframe.html","grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials","urn:openid:params:grant-type:ciba","urn:ietf:params:oauth:grant-type:device_code"],"acr_values_supported":["0","1"],"response_types_supported":["code","none","id_token","token","id_token + token","code id_token","code token","code id_token token"],"subject_types_supported":["public","pairwise"],"id_token_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"id_token_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"id_token_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"userinfo_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"userinfo_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"userinfo_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"request_object_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],"request_object_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"request_object_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"response_modes_supported":["query","fragment","form_post","query.jwt","fragment.jwt","form_post.jwt","jwt"],"registration_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/clients-registrations/openid-connect","token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"token_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"introspection_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"introspection_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"authorization_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"authorization_encryption_alg_values_supported":["RSA-OAEP","RSA-OAEP-256","RSA1_5"],"authorization_encryption_enc_values_supported":["A256GCM","A192GCM","A128GCM","A128CBC-HS256","A192CBC-HS384","A256CBC-HS512"],"claims_supported":["aud","sub","iss","auth_time","name","given_name","family_name","preferred_username","email","acr"],"claim_types_supported":["normal"],"claims_parameter_supported":true,"scopes_supported":["openid","microprofile-jwt","phone","roles","profile","email","address","web-origins","acr","offline_access"],"request_parameter_supported":true,"request_uri_parameter_supported":true,"require_request_uri_registration":true,"code_challenge_methods_supported":["plain","S256"],"tls_client_certificate_bound_access_tokens":true,"revocation_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/revoke","revocation_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],"revocation_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],"backchannel_logout_supported":true,"backchannel_logout_session_supported":true,"device_authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth/device","backchannel_token_delivery_modes_supported":["poll","ping"],"backchannel_authentication_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/ciba/auth","backchannel_authentication_request_signing_alg_values_supported":["PS384","ES384","RS384","ES256","RS256","ES512","PS256","PS512","RS512"],"require_pushed_authorization_requests":false,"pushed_authorization_request_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/par/request","mtls_endpoint_aliases":{"token_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token","revocation_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/revoke","introspection_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token/introspect","device_authorization_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/auth/device","registration_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/clients-registrations/openid-connect","userinfo_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/userinfo","pushed_authorization_request_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/par/request","backchannel_authentication_endpoint":"https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/ext/ciba/auth"},"authorization_response_iss_parameter_supported":true}' + recorded_at: Fri, 24 May 2024 01:48:46 GMT +- request: + method: post + uri: https://login.lescommuns.org/auth/realms/data-food-consortium/protocol/openid-connect/token + body: + encoding: UTF-8 + string: grant_type=refresh_token&refresh_token= + headers: + User-Agent: + - Rack::OAuth2 (2.2.1) + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Date: + - Fri, 24 May 2024 01:48:47 GMT + Content-Type: + - application/json + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Vary: + - Accept-Encoding + Set-Cookie: + - AUTH_SESSION_ID=1716515328.538.9431.297717|6055218c9898cae39f8ffd531999e49a; + Path=/; Secure; HttpOnly + Cache-Control: + - no-store + Pragma: + - no-cache + Referrer-Policy: + - no-referrer + Strict-Transport-Security: + - max-age=15724800; includeSubDomains + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + body: + encoding: ASCII-8BIT + string: '{"access_token":"","expires_in":1800,"refresh_expires_in":31373710,"refresh_token":"","token_type":"Bearer","id_token":"","not-before-policy":0,"session_state":"cfaa4a60-c2aa-4590-9fdf-a117f23d564f","scope":"openid + profile email"}' + recorded_at: Fri, 24 May 2024 01:48:47 GMT +- request: + method: post + uri: https://food-data-collaboration-produc-fe870152f634.herokuapp.com/fdc/products?shop=test-hodmedod.myshopify.com + body: + encoding: UTF-8 + string: '{"userId":"testdfc@protonmail.com","accessToken":""}' + headers: + Content-Type: + - application/json + Authorization: + - "" + User-Agent: + - Faraday v2.9.0 + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - Cowboy + Report-To: + - '{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1716515329&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=db8%2Bqll%2F9ViX4tDoArQRI69fIFO5okGU%2F86h1whY9lM%3D"}]}' + Reporting-Endpoints: + - heroku-nel=https://nel.heroku.com/reports?ts=1716515329&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=db8%2Bqll%2F9ViX4tDoArQRI69fIFO5okGU%2F86h1whY9lM%3D + Nel: + - '{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}' + Connection: + - keep-alive + X-Powered-By: + - Express + Access-Control-Allow-Origin: + - "*" + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '41179' + Etag: + - W/"a0db-ySojxiWOF5gtH86VVAw3VoRbZ/o" + Date: + - Fri, 24 May 2024 01:48:49 GMT + Via: + - 1.1 vegur + body: + encoding: ASCII-8BIT + string: !binary |- + eyJwcm9kdWN0cyI6IntcIkBjb250ZXh0XCI6XCJodHRwczovL3d3dy5kYXRhZm9vZGNvbnNvcnRpdW0ub3JnXCIsXCJAZ3JhcGhcIjpbe1wiQGlkXCI6XCJfOmI0M1wiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjAuNFwifSx7XCJAaWRcIjpcIl86YjQ0XCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIyLjA5XCJ9LHtcIkBpZFwiOlwiXzpiNDVcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIwLjRcIn0se1wiQGlkXCI6XCJfOmI0NlwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMS4xOVwifSx7XCJAaWRcIjpcIl86YjQ3XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC41XCJ9LHtcIkBpZFwiOlwiXzpiNDhcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjEuNjlcIn0se1wiQGlkXCI6XCJfOmI0OVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjAuNFwifSx7XCJAaWRcIjpcIl86YjUwXCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIxLjM5XCJ9LHtcIkBpZFwiOlwiXzpiNTFcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIwLjE3NVwifSx7XCJAaWRcIjpcIl86YjUyXCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIyLjg5XCJ9LHtcIkBpZFwiOlwiXzpiNTNcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIwLjRcIn0se1wiQGlkXCI6XCJfOmI1NFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC45OVwifSx7XCJAaWRcIjpcIl86YjU1XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMC4zXCJ9LHtcIkBpZFwiOlwiXzpiNTZcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjIuOTlcIn0se1wiQGlkXCI6XCJfOmI1N1wiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjQuOFwifSx7XCJAaWRcIjpcIl86YjU4XCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIxOC44NVwifSx7XCJAaWRcIjpcIl86YjU5XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNC44XCJ9LHtcIkBpZFwiOlwiXzpiNjBcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjcuNDJcIn0se1wiQGlkXCI6XCJfOmI2MVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjVcIn0se1wiQGlkXCI6XCJfOmI2MlwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTIuNjBcIn0se1wiQGlkXCI6XCJfOmI2M1wiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpLaWxvZ3JhbVwiLFwiZGZjLWI6dmFsdWVcIjpcIjQuOFwifSx7XCJAaWRcIjpcIl86YjY0XCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCI4Ljc2XCJ9LHtcIkBpZFwiOlwiXzpiNjVcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCIxLjA1XCJ9LHtcIkBpZFwiOlwiXzpiNjZcIixcIkB0eXBlXCI6XCJkZmMtYjpQcmljZVwiLFwiZGZjLWI6VkFUcmF0ZVwiOlwiMFwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06RXVyb1wiLFwiZGZjLWI6dmFsdWVcIjpcIjEzLjA1XCJ9LHtcIkBpZFwiOlwiXzpiNjdcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06S2lsb2dyYW1cIixcImRmYy1iOnZhbHVlXCI6XCI0LjhcIn0se1wiQGlkXCI6XCJfOmI2OFwiLFwiQHR5cGVcIjpcImRmYy1iOlByaWNlXCIsXCJkZmMtYjpWQVRyYXRlXCI6XCIwXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpFdXJvXCIsXCJkZmMtYjp2YWx1ZVwiOlwiNi43NlwifSx7XCJAaWRcIjpcIl86YjY5XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOktpbG9ncmFtXCIsXCJkZmMtYjp2YWx1ZVwiOlwiM1wifSx7XCJAaWRcIjpcIl86YjcwXCIsXCJAdHlwZVwiOlwiZGZjLWI6UHJpY2VcIixcImRmYy1iOlZBVHJhdGVcIjpcIjBcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOkV1cm9cIixcImRmYy1iOnZhbHVlXCI6XCIxNS45MFwifSx7XCJAaWRcIjpcIl86YjcxXCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTJcIn0se1wiQGlkXCI6XCJfOmI3MlwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjFcIn0se1wiQGlkXCI6XCJfOmI3M1wiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjEyXCJ9LHtcIkBpZFwiOlwiXzpiNzRcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiNzVcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxMFwifSx7XCJAaWRcIjpcIl86Yjc2XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMVwifSx7XCJAaWRcIjpcIl86Yjc3XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMTJcIn0se1wiQGlkXCI6XCJfOmI3OFwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjFcIn0se1wiQGlkXCI6XCJfOmI3OVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjZcIn0se1wiQGlkXCI6XCJfOmI4MFwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjFcIn0se1wiQGlkXCI6XCJfOmI4MVwiLFwiQHR5cGVcIjpcImRmYy1iOlF1YW50aXRhdGl2ZVZhbHVlXCIsXCJkZmMtYjpoYXNVbml0XCI6XCJkZmMtbTpQaWVjZVwiLFwiZGZjLWI6dmFsdWVcIjpcIjEyXCJ9LHtcIkBpZFwiOlwiXzpiODJcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxXCJ9LHtcIkBpZFwiOlwiXzpiODNcIixcIkB0eXBlXCI6XCJkZmMtYjpRdWFudGl0YXRpdmVWYWx1ZVwiLFwiZGZjLWI6aGFzVW5pdFwiOlwiZGZjLW06UGllY2VcIixcImRmYy1iOnZhbHVlXCI6XCIxMFwifSx7XCJAaWRcIjpcIl86Yjg0XCIsXCJAdHlwZVwiOlwiZGZjLWI6UXVhbnRpdGF0aXZlVmFsdWVcIixcImRmYy1iOmhhc1VuaXRcIjpcImRmYy1tOlBpZWNlXCIsXCJkZmMtYjp2YWx1ZVwiOlwiMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzVcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmRlc2NyaXB0aW9uXCI6XCI8dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHIgc3R5bGU9XFxcImJvcmRlcjogMHB4O1xcXCI+XFxuPHRkIGJnY29sb3I9XFxcIiNkNmZiZWRcXFwiIHN0eWxlPVxcXCJjb2xvcjogIzAwMDAwMDsgYm9yZGVyOiAwcHg7XFxcIj48c3Ryb25nPlRoZXkncmUgYmFjayE8L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPlxcbjxwPjxzdHJvbmc+VGhpbmsgYmFrZWQgYmVhbnMgYXJlIEJyaXRpc2g/IFRoZXkgYXJlIG5vdyEgV2UgdXNlIG9ubHkgQnJpdGlzaC1ncm93biBmYXZhIGJlYW5zIC0gQnJpdGFpbidzIG9yaWdpbmFsIGJlYW4sIGdyb3duIGhlcmUgc2luY2UgdGhlIElyb24gQWdlLiBPdXIgQmFrZWQgQnJpdGlzaCBCZWFucyBhcmUgZGVsaWNpb3VzbHkgZGlmZmVyZW50LCB3aXRoIGxhcmdlIG1lYXR5IGZhdmEgYmVhbnMgaW4gYSB0YXN0eSB0b21hdG8gc2F1Y2UuPC9zdHJvbmc+PC9wPlxcbjxwPjxzdHJvbmc+PGEgdGl0bGU9XFxcIldoYXQgYXJlIGZhdmEgYmVhbnM/IEFyZW4ndCB0aGV5IGp1c3QgYnJvYWQgYmVhbnM/XFxcIiBocmVmPVxcXCIvYmxvZ3MvbmV3cy93aGF0LWFyZS1mYXZhLWJlYW5zLWFyZS10aGV5LWp1c3QtYnJvYWQtYmVhbnNcXFwiIGRhdGEtbWNlLWZyYWdtZW50PVxcXCIxXFxcIiBkYXRhLW1jZS1ocmVmPVxcXCIvYmxvZ3MvbmV3cy93aGF0LWFyZS1mYXZhLWJlYW5zLWFyZS10aGV5LWp1c3QtYnJvYWQtYmVhbnNcXFwiPldoYXQgYXJlIGZhdmEgYmVhbnM/IEZpbmQgb3V0IGhlcmUuLi48L2E+PC9zdHJvbmc+PC9wPlxcbjwhLS0gc3BsaXQgLS0+PGgzPkNvbXBsZXRlIFByb2R1Y3QgRGV0YWlsczwvaDM+PHA+T3VyIEJha2VkIEJyaXRpc2ggQmVhbnMgYXJlIGNvb2tlZCBhbmQgcmVhZHkgdG8gZWF0LCBob3Qgb3IgY29sZC4gVGhleSdyZSBnb29kIHNlcnZlZCBvbiB0b2FzdCBidXQgYWxzbyBkZWxpY2lvdXMgYWRkZWQgdG8gc3Rld3MsIGN1cnJpZXMgb3IgY2Fzc2Vyb2xlcy4gT3IgZXZlbiBpbiBhIHBpZS48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+Q29va2luZyBpbnN0cnVjdGlvbnM8L2g1PlxcbjxwPjxzdHJvbmc+Q29va2luZyBvbiB0aGUgSG9iPC9zdHJvbmc+PGJyPkVtcHR5IGNvbnRlbnRzIGludG8gc2F1Y2VwYW4uIEhlYXQgZ2VudGx5IGZvciA0LTUgbWludXRlcyB3aGlsZSBzdGlycmluZy4gRm9yIGJlc3QgZmxhdm91ciBkbyBub3QgYm9pbCBvciBvdmVyY29vay4gRG8gbm90IHJlaGVhdC48L3A+XFxuPHA+PHN0cm9uZz5NaWNyb3dhdmUgQ29va2luZzwvc3Ryb25nPjxicj5FbXB0eSBjb250ZW50cyBpbnRvIGEgbm9uLW1ldGFsbGljIGJvd2wgYW5kIGNvdmVyLiBIZWF0IGZvciAyIHRvIDMgbWludXRlcywgc3RpcnJpbmcgaGFsZndheS4gQ2hlY2sgdGhlIGZvb2QgaXMgaG90LCBzdGlyIHdlbGwgYW5kIHNlcnZlLiBEbyBub3QgcmVoZWF0LjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5UbyBTdG9yZTwvaDU+XFxuPHA+U3RvcmUgaW4gYSBjb29sLCBkcnkgcGxhY2UuIE9uY2Ugb3BlbmVkLCB0cmFuc2ZlciBjb250ZW50cyB0byBhIG5vbi1tZXRhbGxpYyBjb250YWluZXIsIGNvdmVyIHJlZnJpZ2VyYXRlIGFuZCB1c2Ugd2l0aCAyIGRheXMuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkluZ3JlZGllbnRzPC9oNT5cXG48cD5GYXZhIEJlYW5zIChCcm9hZCBCZWFucykgKDQyJSksIFdhdGVyLCBUb21hdG8gUHVyZWUsIFN1Z2FyLCBNb2RpZmllZCBNYWl6ZSBTdGFyY2gsIFNhbHQsIEhlcmJzICZhbXA7IFNwaWNlcywgQ29uY2VudHJhdGVkIExlbW9uIEp1aWNlPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkFsbGVyZ3kgaW5mb3JtYXRpb248L2g1PlxcbjxwPk5vIEFsbGVyZ2VuczwvcD5cXG48dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHI+XFxuPHRkPjxzdHJvbmc+VHlwaWNhbCB2YWx1ZXM8L3N0cm9uZz48L3RkPlxcbjx0ZD48c3Ryb25nPlBlciAxMDBnPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RW5lcmd5PC90ZD5cXG48dGQ+Mjkya0ogKDY5a2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4wLjRnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjEwLjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+NC42ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+NWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5Qcm90ZWluPC90ZD5cXG48dGQ+NGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5TYWx0PC90ZD5cXG48dGQ+MC42ZzwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+PGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+TW9yZTwvaDU+XFxuPHA+RGVsaWNpb3VzLCBudXRyaXRpb3VzIGFuZCBnb29kIGZvciB0aGUgc29pbCwgZmF2YSBiZWFucyBhcmUgYSB2YXJpZXR5IG9mIGJyb2FkIGJlYW4sIFZpY2lhIGZhYmEsIGxlZnQgdG8gcmlwZW4gYW5kIGRyeSBiZWZvcmUgaGFydmVzdC4gVGhleeKAmXJlIGFsc28ga25vd24gYXMgZmllbGQgYmVhbnMsIGhvcnNlIGJlYW5zLCBXaW5kc29yIGJlYW5zIG9yIGZ1bC48L3A+XFxuPHA+U3VpdGFibGUgZm9yIHZlZ2FucyBhbmQgdmVnZXRhcmlhbnM8L3A+XFxuXCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNDNcIixcImRmYy1iOmltYWdlXCI6XCJodHRwczovL2Nkbi5zaG9waWZ5LmNvbS9zL2ZpbGVzLzEvMDczMS84NDgzLzc5MzkvcHJvZHVjdHMvUGFjay1DYW4tQmFrZWQtQmVhbnMtMTgwMHg2Xzk4M3g2NTZfNTEzNzU4ZTYtMjYxNi00Njg3LWE4YjItYmE2ZGRlODY0OTIzLmpwZz92PTE2Nzc3NjA3NzhcIixcImRmYy1iOm5hbWVcIjpcIkJha2VkIEJyaXRpc2ggQmVhbnMgLSBSZXRhaWwgY2FuLCA0MDBnIChjYW4pXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk5DQkIvVDRcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI0NFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNzFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NDY3NjM1L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNzJcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNS90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY0Njc2MzUvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjQ2NzYzNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzXCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpkZXNjcmlwdGlvblwiOlwiPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyIHN0eWxlPVxcXCJib3JkZXI6IDBweDtcXFwiPlxcbjx0ZCBiZ2NvbG9yPVxcXCIjZDZmYmVkXFxcIiBzdHlsZT1cXFwiY29sb3I6ICMwMDAwMDA7IGJvcmRlcjogMHB4O1xcXCI+PHN0cm9uZz5UaGV5J3JlIGJhY2shPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjwvdGJvZHk+XFxuPC90YWJsZT5cXG48cD48c3Ryb25nPlRoaW5rIGJha2VkIGJlYW5zIGFyZSBCcml0aXNoPyBUaGV5IGFyZSBub3chIFdlIHVzZSBvbmx5IEJyaXRpc2gtZ3Jvd24gZmF2YSBiZWFucyAtIEJyaXRhaW4ncyBvcmlnaW5hbCBiZWFuLCBncm93biBoZXJlIHNpbmNlIHRoZSBJcm9uIEFnZS4gT3VyIEJha2VkIEJyaXRpc2ggQmVhbnMgYXJlIGRlbGljaW91c2x5IGRpZmZlcmVudCwgd2l0aCBsYXJnZSBtZWF0eSBmYXZhIGJlYW5zIGluIGEgdGFzdHkgdG9tYXRvIHNhdWNlLjwvc3Ryb25nPjwvcD5cXG48cD48c3Ryb25nPjxhIHRpdGxlPVxcXCJXaGF0IGFyZSBmYXZhIGJlYW5zPyBBcmVuJ3QgdGhleSBqdXN0IGJyb2FkIGJlYW5zP1xcXCIgaHJlZj1cXFwiL2Jsb2dzL25ld3Mvd2hhdC1hcmUtZmF2YS1iZWFucy1hcmUtdGhleS1qdXN0LWJyb2FkLWJlYW5zXFxcIiBkYXRhLW1jZS1mcmFnbWVudD1cXFwiMVxcXCIgZGF0YS1tY2UtaHJlZj1cXFwiL2Jsb2dzL25ld3Mvd2hhdC1hcmUtZmF2YS1iZWFucy1hcmUtdGhleS1qdXN0LWJyb2FkLWJlYW5zXFxcIj5XaGF0IGFyZSBmYXZhIGJlYW5zPyBGaW5kIG91dCBoZXJlLi4uPC9hPjwvc3Ryb25nPjwvcD5cXG48IS0tIHNwbGl0IC0tPjxoMz5Db21wbGV0ZSBQcm9kdWN0IERldGFpbHM8L2gzPjxwPk91ciBCYWtlZCBCcml0aXNoIEJlYW5zIGFyZSBjb29rZWQgYW5kIHJlYWR5IHRvIGVhdCwgaG90IG9yIGNvbGQuIFRoZXkncmUgZ29vZCBzZXJ2ZWQgb24gdG9hc3QgYnV0IGFsc28gZGVsaWNpb3VzIGFkZGVkIHRvIHN0ZXdzLCBjdXJyaWVzIG9yIGNhc3Nlcm9sZXMuIE9yIGV2ZW4gaW4gYSBwaWUuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkNvb2tpbmcgaW5zdHJ1Y3Rpb25zPC9oNT5cXG48cD48c3Ryb25nPkNvb2tpbmcgb24gdGhlIEhvYjwvc3Ryb25nPjxicj5FbXB0eSBjb250ZW50cyBpbnRvIHNhdWNlcGFuLiBIZWF0IGdlbnRseSBmb3IgNC01IG1pbnV0ZXMgd2hpbGUgc3RpcnJpbmcuIEZvciBiZXN0IGZsYXZvdXIgZG8gbm90IGJvaWwgb3Igb3ZlcmNvb2suIERvIG5vdCByZWhlYXQuPC9wPlxcbjxwPjxzdHJvbmc+TWljcm93YXZlIENvb2tpbmc8L3N0cm9uZz48YnI+RW1wdHkgY29udGVudHMgaW50byBhIG5vbi1tZXRhbGxpYyBib3dsIGFuZCBjb3Zlci4gSGVhdCBmb3IgMiB0byAzIG1pbnV0ZXMsIHN0aXJyaW5nIGhhbGZ3YXkuIENoZWNrIHRoZSBmb29kIGlzIGhvdCwgc3RpciB3ZWxsIGFuZCBzZXJ2ZS4gRG8gbm90IHJlaGVhdC48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+VG8gU3RvcmU8L2g1PlxcbjxwPlN0b3JlIGluIGEgY29vbCwgZHJ5IHBsYWNlLiBPbmNlIG9wZW5lZCwgdHJhbnNmZXIgY29udGVudHMgdG8gYSBub24tbWV0YWxsaWMgY29udGFpbmVyLCBjb3ZlciByZWZyaWdlcmF0ZSBhbmQgdXNlIHdpdGggMiBkYXlzLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5JbmdyZWRpZW50czwvaDU+XFxuPHA+RmF2YSBCZWFucyAoQnJvYWQgQmVhbnMpICg0MiUpLCBXYXRlciwgVG9tYXRvIFB1cmVlLCBTdWdhciwgTW9kaWZpZWQgTWFpemUgU3RhcmNoLCBTYWx0LCBIZXJicyAmYW1wOyBTcGljZXMsIENvbmNlbnRyYXRlZCBMZW1vbiBKdWljZTwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5BbGxlcmd5IGluZm9ybWF0aW9uPC9oNT5cXG48cD5ObyBBbGxlcmdlbnM8L3A+XFxuPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyPlxcbjx0ZD48c3Ryb25nPlR5cGljYWwgdmFsdWVzPC9zdHJvbmc+PC90ZD5cXG48dGQ+PHN0cm9uZz5QZXIgMTAwZzwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkVuZXJneTwvdGQ+XFxuPHRkPjI5MmtKICg2OWtjYWwpPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmF0PC90ZD5cXG48dGQ+MC40ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHNhdHVyYXRlczwvdGQ+XFxuPHRkPjAuMWc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5DYXJib2h5ZHJhdGU8L3RkPlxcbjx0ZD4xMC4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHN1Z2FyczwvdGQ+XFxuPHRkPjQuNmc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GaWJyZTwvdGQ+XFxuPHRkPjVnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+UHJvdGVpbjwvdGQ+XFxuPHRkPjRnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+U2FsdDwvdGQ+XFxuPHRkPjAuNmc8L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPk1vcmU8L2g1PlxcbjxwPkRlbGljaW91cywgbnV0cml0aW91cyBhbmQgZ29vZCBmb3IgdGhlIHNvaWwsIGZhdmEgYmVhbnMgYXJlIGEgdmFyaWV0eSBvZiBicm9hZCBiZWFuLCBWaWNpYSBmYWJhLCBsZWZ0IHRvIHJpcGVuIGFuZCBkcnkgYmVmb3JlIGhhcnZlc3QuIFRoZXnigJlyZSBhbHNvIGtub3duIGFzIGZpZWxkIGJlYW5zLCBob3JzZSBiZWFucywgV2luZHNvciBiZWFucyBvciBmdWwuPC9wPlxcbjxwPlN1aXRhYmxlIGZvciB2ZWdhbnMgYW5kIHZlZ2V0YXJpYW5zPC9wPlxcblwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjU3XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL1BhY2stQ2FuLUJha2VkLUJlYW5zLTE4MDB4Nl85ODN4NjU2XzUxMzc1OGU2LTI2MTYtNDY4Ny1hOGIyLWJhNmRkZTg2NDkyMy5qcGc/dj0xNjc3NzYwNzc4XCIsXCJkZmMtYjpuYW1lXCI6XCJCYWtlZCBCcml0aXNoIEJlYW5zIC0gQ2FzZSwgMTIgeCA0MDBnIChjYW4pXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MDA0MDMvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzL2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzL29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk5DQkIvQ0RcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTAwNDAzL29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI1OFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTMzMTcxXCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpkZXNjcmlwdGlvblwiOlwiPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyIHN0eWxlPVxcXCJib3JkZXI6IDBweDtcXFwiPlxcbjx0ZCBiZ2NvbG9yPVxcXCIjZDZmYmVkXFxcIiBzdHlsZT1cXFwiY29sb3I6ICMwMDAwMDA7IGJvcmRlcjogMHB4O1xcXCI+PHN0cm9uZz5Tb3JyeSwgc3RhbmRhcmQgYmFybGV5IGZsYWtlcyBhcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZSBidXQgb3VyIGRlbGljaW91cyAgT3JnYW5pYyBOYWtlZCBCYXJsZXkgRmxha2VzIGFyZSBiYWNrLjwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+PHA+T3VyIHJpY2ggYW5kIG1hbHR5IGJhcmxleSBmbGFrZXMgYXJlIGEgc3RvcmUgY3VwYm9hcmQgc3RhcGxlLiBPcmdhbmljYWxseSBncm93biBhbmQgbWlsbGVkIGluIHRoZSBVSywgdGhleSBhZGQgdGV4dHVyZSB0byBmbGFwamFjayBhbmQgYmlzY3VpdCByZWNpcGVzLCBvciB0byBtYWtlIGEgaGVhcnRpZXIsIHJ1c3RpYyBwb3JyaWRnZSDigJMgdHJ5IGJsZW5kaW5nIHdpdGggb3VyIG90aGVyIGZsYWtlczwvcD5cXG48IS0tIHNwbGl0IC0tPjxoMz5Db21wbGV0ZSBQcm9kdWN0IERldGFpbHM8L2gzPjxsaSBpZD1cXFwidGFiMVxcXCIgY2xhc3M9XFxcImFjdGl2ZVxcXCI+XFxuPHA+QmFybGV5IGZsYWtlcyBhcmUgZ3JlYXQgYWRkZWQgdG8gbXVlc2xpIG9yIGdyYW5vbGEsIG9yIHVzZWQgaW4gYmFraW5nIGFzIGEgdG9wcGluZyBvciBtaXhlZCBpbnRvIGRvdWdoLiBFYXQgdGhlbSBhcyBhIGNlcmVhbCwgYmFrZSB3aXRoIHRoZW0sIG9yIGFkZCB0aGVtIHRvIHNvdXBzIGFuZCBzdGV3cyB0byB0aGlja2VuLCBib29zdCB0aGVpciBudXRyaXRpb24gYW5kIGFkZCBmbGF2b3VyLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Db29raW5nIGluc3RydWN0aW9uczwvaDU+XFxuPHA+VG8gZWF0IGFzIGEgbXVlc2xpLCBjb21iaW5lIHdpdGggb3RoZXIgY2VyZWFsIGZsYWtlcyBhbmQgZW5qb3kuIE9yIHVzZSBhcyBhbiBvYXQgc3Vic3RpdHV0ZSBpbiBhbnkgYmFraW5nIHJlY2lwZS48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+SW5ncmVkaWVudHM8L2g1PlxcbjxwPjxiPkJhcmxlecKgPC9iPkZsYWtlczwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5BbGxlcmd5IGluZm9ybWF0aW9uPC9oNT5cXG48cD5Gb3IgYWxsZXJnZW5zLCBpbmNsdWRpbmcgY2VyZWFscyBjb250YWluaW5nIGdsdXRlbiwgc2VlIGluZ3JlZGllbnRzIGluIDxzdHJvbmc+Ym9sZDwvc3Ryb25nPjwvcD5cXG48dGFibGUgd2lkdGg9XFxcIjEwMCVcXFwiPlxcbjx0Ym9keT5cXG48dHI+XFxuPHRkPjxzdHJvbmc+VHlwaWNhbCB2YWx1ZXM8L3N0cm9uZz48L3RkPlxcbjx0ZD48c3Ryb25nPlBlciAxMDBnPC9zdHJvbmc+PC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RW5lcmd5PC90ZD5cXG48dGQ+MSw0MDFrSiAoMzMya2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4yLjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC4wZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjU4LjNnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+MS43ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+MTcuM2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5Qcm90ZWluPC90ZD5cXG48dGQ+MTEuNGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5TYWx0PC90ZD5cXG48dGQ+MC4wZzwvdGQ+XFxuPC90cj5cXG48L3Rib2R5PlxcbjwvdGFibGU+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+TW9yZTwvaDU+XFxuPHVsPlxcbjxsaT5TdWl0YWJsZSBmb3IgdmVnYW5zIGFuZCB2ZWdldGFyaWFuc1xcbjwvbGk+XFxuPGxpPk5vIGFydGlmaWNpYWwgaW5ncmVkaWVudHNcXG48L2xpPlxcbjxsaT5HTSBmcmVlXFxuPC9saT5cXG48bGk+SGlnaCBGaWJyZVxcbjwvbGk+XFxuPC91bD5cXG48L2xpPlwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjQ3XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL0JhcmxleS1GbGFrZXMtMjQwMHgxNjAwX2MxMjE0MDdjLTZmZDItNDZjYS1hMTI0LWRiNWRmOTQ0MjM2OC5qcGc/dj0xNjc3NzYwNzgxXCIsXCJkZmMtYjpuYW1lXCI6XCJCYXJsZXkgRmxha2VzLCBPcmdhbmljIC0gUmV0YWlsIHBhY2ssIDUwMGdcIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiT0tCQVI1XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNDhcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpjb25zdW1lc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MVwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86Yjc1XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjUzMzE3MS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86Yjc2XCIsXCJkZmMtYjpwcm9kdWNlc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjU2NTkzOVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvdHJhbnNmb3JtYXRpb25cIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRUcmFuc2Zvcm1hdGlvblwiLFwiZGZjLWI6aGFzSW5jb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTMzMTcxL3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmhhc091dGNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NjY1MzMxNzEvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjU2NTkzOVwiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6ZGVzY3JpcHRpb25cIjpcIjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0ciBzdHlsZT1cXFwiYm9yZGVyOiAwcHg7XFxcIj5cXG48dGQgYmdjb2xvcj1cXFwiI2Q2ZmJlZFxcXCIgc3R5bGU9XFxcImNvbG9yOiAjMDAwMDAwOyBib3JkZXI6IDBweDtcXFwiPjxzdHJvbmc+U29ycnksIHN0YW5kYXJkIGJhcmxleSBmbGFrZXMgYXJlIG5vIGxvbmdlciBhdmFpbGFibGUgYnV0IG91ciBkZWxpY2lvdXMgIE9yZ2FuaWMgTmFrZWQgQmFybGV5IEZsYWtlcyBhcmUgYmFjay48L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPjxwPk91ciByaWNoIGFuZCBtYWx0eSBiYXJsZXkgZmxha2VzIGFyZSBhIHN0b3JlIGN1cGJvYXJkIHN0YXBsZS4gT3JnYW5pY2FsbHkgZ3Jvd24gYW5kIG1pbGxlZCBpbiB0aGUgVUssIHRoZXkgYWRkIHRleHR1cmUgdG8gZmxhcGphY2sgYW5kIGJpc2N1aXQgcmVjaXBlcywgb3IgdG8gbWFrZSBhIGhlYXJ0aWVyLCBydXN0aWMgcG9ycmlkZ2Ug4oCTIHRyeSBibGVuZGluZyB3aXRoIG91ciBvdGhlciBmbGFrZXM8L3A+XFxuPCEtLSBzcGxpdCAtLT48aDM+Q29tcGxldGUgUHJvZHVjdCBEZXRhaWxzPC9oMz48bGkgaWQ9XFxcInRhYjFcXFwiIGNsYXNzPVxcXCJhY3RpdmVcXFwiPlxcbjxwPkJhcmxleSBmbGFrZXMgYXJlIGdyZWF0IGFkZGVkIHRvIG11ZXNsaSBvciBncmFub2xhLCBvciB1c2VkIGluIGJha2luZyBhcyBhIHRvcHBpbmcgb3IgbWl4ZWQgaW50byBkb3VnaC4gRWF0IHRoZW0gYXMgYSBjZXJlYWwsIGJha2Ugd2l0aCB0aGVtLCBvciBhZGQgdGhlbSB0byBzb3VwcyBhbmQgc3Rld3MgdG8gdGhpY2tlbiwgYm9vc3QgdGhlaXIgbnV0cml0aW9uIGFuZCBhZGQgZmxhdm91ci48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+Q29va2luZyBpbnN0cnVjdGlvbnM8L2g1PlxcbjxwPlRvIGVhdCBhcyBhIG11ZXNsaSwgY29tYmluZSB3aXRoIG90aGVyIGNlcmVhbCBmbGFrZXMgYW5kIGVuam95LiBPciB1c2UgYXMgYW4gb2F0IHN1YnN0aXR1dGUgaW4gYW55IGJha2luZyByZWNpcGUuPC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkluZ3JlZGllbnRzPC9oNT5cXG48cD48Yj5CYXJsZXnCoDwvYj5GbGFrZXM8L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+QWxsZXJneSBpbmZvcm1hdGlvbjwvaDU+XFxuPHA+Rm9yIGFsbGVyZ2VucywgaW5jbHVkaW5nIGNlcmVhbHMgY29udGFpbmluZyBnbHV0ZW4sIHNlZSBpbmdyZWRpZW50cyBpbiA8c3Ryb25nPmJvbGQ8L3N0cm9uZz48L3A+XFxuPHRhYmxlIHdpZHRoPVxcXCIxMDAlXFxcIj5cXG48dGJvZHk+XFxuPHRyPlxcbjx0ZD48c3Ryb25nPlR5cGljYWwgdmFsdWVzPC9zdHJvbmc+PC90ZD5cXG48dGQ+PHN0cm9uZz5QZXIgMTAwZzwvc3Ryb25nPjwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkVuZXJneTwvdGQ+XFxuPHRkPjEsNDAxa0ogKDMzMmtjYWwpPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+RmF0PC90ZD5cXG48dGQ+Mi4xZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHNhdHVyYXRlczwvdGQ+XFxuPHRkPjAuMGc8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5DYXJib2h5ZHJhdGU8L3RkPlxcbjx0ZD41OC4zZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPm9mIHdoaWNoIHN1Z2FyczwvdGQ+XFxuPHRkPjEuN2c8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GaWJyZTwvdGQ+XFxuPHRkPjE3LjNnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+UHJvdGVpbjwvdGQ+XFxuPHRkPjExLjRnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+U2FsdDwvdGQ+XFxuPHRkPjAuMGc8L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPk1vcmU8L2g1Plxcbjx1bD5cXG48bGk+U3VpdGFibGUgZm9yIHZlZ2FucyBhbmQgdmVnZXRhcmlhbnNcXG48L2xpPlxcbjxsaT5ObyBhcnRpZmljaWFsIGluZ3JlZGllbnRzXFxuPC9saT5cXG48bGk+R00gZnJlZVxcbjwvbGk+XFxuPGxpPkhpZ2ggRmlicmVcXG48L2xpPlxcbjwvdWw+XFxuPC9saT5cIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI2MVwiLFwiZGZjLWI6aW1hZ2VcIjpcImh0dHBzOi8vY2RuLnNob3BpZnkuY29tL3MvZmlsZXMvMS8wNzMxLzg0ODMvNzkzOS9wcm9kdWN0cy9CYXJsZXktRmxha2VzLTI0MDB4MTYwMF9jMTIxNDA3Yy02ZmQyLTQ2Y2EtYTEyNC1kYjVkZjk0NDIzNjguanBnP3Y9MTY3Nzc2MDc4MVwiLFwiZGZjLWI6bmFtZVwiOlwiQmFybGV5IEZsYWtlcywgT3JnYW5pYyAtIFN0YW5kYXJkIGNhc2UsIDEwIHggNTAwZ1wiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5L2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjU2NTkzOS9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ2NjU2NTkzOS9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJPS0JBQ1hcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDY2NTY1OTM5L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI2MlwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpkZXNjcmlwdGlvblwiOlwiPHA+PHN0cm9uZz5GZXJtZW50ZWQgd2hvbGVncmFpbiBuYWtlZCBiYXJsZXkswqB0YXN0eSBhbmQgc3VjY3VsZW50wqBncmFpbnMgb2YgcmljaCBtYWx0eSB1bWFtaSBmbGF2b3VyLjwvc3Ryb25nPjwvcD5cXG48cD5UaGVzZSB3aG9sZSBmZXJtZW50ZWQgYmFybGV5wqBncmFpbnMgYXJlIHBhY2tlZCB3aXRoIGRlZXAgZmxhdm91ciBhbmQgbWFrZSBhIGRlbGljaW91cyBhZGRpdGlvbiB0byBicmVhZCwgcmlzb3R0bywgc3Rld3MsIHNhbGFkcyBhbmQgbW9yZS48L3A+XFxuPCEtLSBzcGxpdCAtLT48aDM+Q29tcGxldGUgUHJvZHVjdCBEZXRhaWxzPC9oMz5cXG48cD5BZGQgaW50ZW5zZWx5IGZsYXZvdXJlZCBtYWx0eSBhbmQgc3VjY3VsZW50IGdyYWluc8KgZnVsbCBvZiB1bWFtaSByaWNobmVzcyB0byBicmVhZHMsIHJpc290dG8sIHN0ZXdzLCBzb3VwcywgYW5kIGV2ZW4gc2FsYWRzLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Db29raW5nIGluc3RydWN0aW9uczwvaDU+XFxuPHA+QWRkIGFib3V0IGhhbGYgYSB0ZWFzcG9vbiBwZXIgc2VydmluZyB0byBhbG1vc3QgYW55IGRpc2ggZm9yIGFkZGVkIGRlcHRoLCB1bWFtaSByaWNobmVzcyBhbmQgbWFsdHkgZmxhdm91ci48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+VG8gc3RvcmU8L2g1PlxcbjxwPktlZXAgcmVmcmlnZXJhdGVkIGFuZCB1c2Ugd2l0aGluIDQgd2Vla3Mgb2Ygb3BlbmluZy48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+SW5ncmVkaWVudHM8L2g1PlxcbjxwPk5ha2VkIDxzdHJvbmc+QmFybGV5PC9zdHJvbmc+LCBXYXRlciwgPHN0cm9uZz5XaGVhdDwvc3Ryb25nPiBGbG91ciwgU2FsdCwgTGl2ZSBDdWx0dXJlcyo8YnI+ICo8ZW0+TGFjdG9iYWNpbGx1cyBkZWxicnVlY2tpaTwvZW0+LCA8ZW0+QXNwZXJnaWxsdXMgc29qYWU8L2VtPiwgPGVtPlp5Z29zYWNjaGFyb215Y2VzIHJvdXhpaTwvZW0+PC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkFsbGVyZ3kgaW5mb3JtYXRpb248L2g1PlxcbjxwPkNvbnRhaW5zIDxzdHJvbmc+QmFybGV5IChHbHV0ZW4pPC9zdHJvbmc+LDxzdHJvbmc+IFdoZWF0IChHbHV0ZW4pPC9zdHJvbmc+PC9wPlxcbjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0cj5cXG48dGQ+PHN0cm9uZz5UeXBpY2FsIHZhbHVlczwvc3Ryb25nPjwvdGQ+XFxuPHRkPjxzdHJvbmc+UGVyIDEwMGc8L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5FbmVyZ3k8L3RkPlxcbjx0ZD41MDBrSiAoMTE5a2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4xLjdnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC41ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjE5LjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+Mi43ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+NS4yZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPlByb3RlaW48L3RkPlxcbjx0ZD40LjJnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+U2FsdDwvdGQ+XFxuPHRkPjguNWc8L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPk1vcmU8L2g1PlxcbjxwPk91ciBGZXJtZW50ZWQgV2hvbGVncmFpbiBOYWtlZCBCYXJsZXkgaXMgZmVybWVudGVkIGluIHRoZSBzYW1lIHdheSBhcyBtYW55IHNveWEgZmVybWVudHMgdXNlZCBmb3IgYmxhY2sgYmVhbnMsIGJ1dCB1c2luZ8KgbmFrZWQgYmFybGV5IGdyYWluIGluc3RlYWQgb2Ygc295IGJlYW5zLiBJdCdzIG1hZGUgd2l0aCBqdXN0IG5ha2VkIGJhcmxleSBncmFpbnMsIHdhdGVyIGFuZCBzYWx0LCBmZXJtZW50ZWQgd2l0aCBhIGxpdmUgY3VsdHVyZSBvZiA8ZW0+TGFjdG9iYWNpbGx1cyBkZWxicnVlY2tpaTwvZW0+LCA8ZW0+QXNwZXJnaWxsdXMgc29qYWU8L2VtPiBhbmQgPGVtPlp5Z29zYWNjaGFyb215Y2VzIHJvdXhpaTwvZW0+LjwvcD5cXG48cD5TdWl0YWJsZSBmb3IgdmVnYW5zLjwvcD5cXG48cD5QYWNrZWQgaW4gcmVjeWNsYWJsZSBnbGFzcyBqYXIgd2l0aCBtZXRhbCBsaWQuPC9wPlwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjUxXCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL0Zlcm1lbnRlZC1XaG9sZWdyYWluLU5ha2VkLUJhcmxleS1TcG9vbi0xNjAweDEwMDBfZDZmZWEwOTItZmRlNC00YTk4LWJlYzgtYmIzY2EwYTFmZDRkLmpwZz92PTE2Nzc3NjA4NjBcIixcImRmYy1iOm5hbWVcIjpcIkZlcm1lbnRlZCBOYWtlZCBCYXJsZXkgLSBSZXRhaWwgamFyLCAxNzVnIChqYXIpXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzNDg5MTUvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk5NTkIvSkZcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI1MlwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNzlcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzQ4OTE1L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiODBcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzgxNjgzXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MTk0NzMzNDg5MTUvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM0ODkxNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzgxNjgzXCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpkZXNjcmlwdGlvblwiOlwiPHA+PHN0cm9uZz5GZXJtZW50ZWQgd2hvbGVncmFpbiBuYWtlZCBiYXJsZXkswqB0YXN0eSBhbmQgc3VjY3VsZW50wqBncmFpbnMgb2YgcmljaCBtYWx0eSB1bWFtaSBmbGF2b3VyLjwvc3Ryb25nPjwvcD5cXG48cD5UaGVzZSB3aG9sZSBmZXJtZW50ZWQgYmFybGV5wqBncmFpbnMgYXJlIHBhY2tlZCB3aXRoIGRlZXAgZmxhdm91ciBhbmQgbWFrZSBhIGRlbGljaW91cyBhZGRpdGlvbiB0byBicmVhZCwgcmlzb3R0bywgc3Rld3MsIHNhbGFkcyBhbmQgbW9yZS48L3A+XFxuPCEtLSBzcGxpdCAtLT48aDM+Q29tcGxldGUgUHJvZHVjdCBEZXRhaWxzPC9oMz5cXG48cD5BZGQgaW50ZW5zZWx5IGZsYXZvdXJlZCBtYWx0eSBhbmQgc3VjY3VsZW50IGdyYWluc8KgZnVsbCBvZiB1bWFtaSByaWNobmVzcyB0byBicmVhZHMsIHJpc290dG8sIHN0ZXdzLCBzb3VwcywgYW5kIGV2ZW4gc2FsYWRzLjwvcD5cXG48aDUgY2xhc3M9XFxcInByb2R1Y3QtZGV0YWlsLXRpdGxlXFxcIj5Db29raW5nIGluc3RydWN0aW9uczwvaDU+XFxuPHA+QWRkIGFib3V0IGhhbGYgYSB0ZWFzcG9vbiBwZXIgc2VydmluZyB0byBhbG1vc3QgYW55IGRpc2ggZm9yIGFkZGVkIGRlcHRoLCB1bWFtaSByaWNobmVzcyBhbmQgbWFsdHkgZmxhdm91ci48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+VG8gc3RvcmU8L2g1PlxcbjxwPktlZXAgcmVmcmlnZXJhdGVkIGFuZCB1c2Ugd2l0aGluIDQgd2Vla3Mgb2Ygb3BlbmluZy48L3A+XFxuPGg1IGNsYXNzPVxcXCJwcm9kdWN0LWRldGFpbC10aXRsZVxcXCI+SW5ncmVkaWVudHM8L2g1PlxcbjxwPk5ha2VkIDxzdHJvbmc+QmFybGV5PC9zdHJvbmc+LCBXYXRlciwgPHN0cm9uZz5XaGVhdDwvc3Ryb25nPiBGbG91ciwgU2FsdCwgTGl2ZSBDdWx0dXJlcyo8YnI+ICo8ZW0+TGFjdG9iYWNpbGx1cyBkZWxicnVlY2tpaTwvZW0+LCA8ZW0+QXNwZXJnaWxsdXMgc29qYWU8L2VtPiwgPGVtPlp5Z29zYWNjaGFyb215Y2VzIHJvdXhpaTwvZW0+PC9wPlxcbjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPkFsbGVyZ3kgaW5mb3JtYXRpb248L2g1PlxcbjxwPkNvbnRhaW5zIDxzdHJvbmc+QmFybGV5IChHbHV0ZW4pPC9zdHJvbmc+LDxzdHJvbmc+IFdoZWF0IChHbHV0ZW4pPC9zdHJvbmc+PC9wPlxcbjx0YWJsZSB3aWR0aD1cXFwiMTAwJVxcXCI+XFxuPHRib2R5Plxcbjx0cj5cXG48dGQ+PHN0cm9uZz5UeXBpY2FsIHZhbHVlczwvc3Ryb25nPjwvdGQ+XFxuPHRkPjxzdHJvbmc+UGVyIDEwMGc8L3N0cm9uZz48L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5FbmVyZ3k8L3RkPlxcbjx0ZD41MDBrSiAoMTE5a2NhbCk8L3RkPlxcbjwvdHI+XFxuPHRyPlxcbjx0ZD5GYXQ8L3RkPlxcbjx0ZD4xLjdnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc2F0dXJhdGVzPC90ZD5cXG48dGQ+MC41ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkNhcmJvaHlkcmF0ZTwvdGQ+XFxuPHRkPjE5LjFnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+b2Ygd2hpY2ggc3VnYXJzPC90ZD5cXG48dGQ+Mi43ZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPkZpYnJlPC90ZD5cXG48dGQ+NS4yZzwvdGQ+XFxuPC90cj5cXG48dHI+XFxuPHRkPlByb3RlaW48L3RkPlxcbjx0ZD40LjJnPC90ZD5cXG48L3RyPlxcbjx0cj5cXG48dGQ+U2FsdDwvdGQ+XFxuPHRkPjguNWc8L3RkPlxcbjwvdHI+XFxuPC90Ym9keT5cXG48L3RhYmxlPjxoNSBjbGFzcz1cXFwicHJvZHVjdC1kZXRhaWwtdGl0bGVcXFwiPk1vcmU8L2g1PlxcbjxwPk91ciBGZXJtZW50ZWQgV2hvbGVncmFpbiBOYWtlZCBCYXJsZXkgaXMgZmVybWVudGVkIGluIHRoZSBzYW1lIHdheSBhcyBtYW55IHNveWEgZmVybWVudHMgdXNlZCBmb3IgYmxhY2sgYmVhbnMsIGJ1dCB1c2luZ8KgbmFrZWQgYmFybGV5IGdyYWluIGluc3RlYWQgb2Ygc295IGJlYW5zLiBJdCdzIG1hZGUgd2l0aCBqdXN0IG5ha2VkIGJhcmxleSBncmFpbnMsIHdhdGVyIGFuZCBzYWx0LCBmZXJtZW50ZWQgd2l0aCBhIGxpdmUgY3VsdHVyZSBvZiA8ZW0+TGFjdG9iYWNpbGx1cyBkZWxicnVlY2tpaTwvZW0+LCA8ZW0+QXNwZXJnaWxsdXMgc29qYWU8L2VtPiBhbmQgPGVtPlp5Z29zYWNjaGFyb215Y2VzIHJvdXhpaTwvZW0+LjwvcD5cXG48cD5TdWl0YWJsZSBmb3IgdmVnYW5zLjwvcD5cXG48cD5QYWNrZWQgaW4gcmVjeWNsYWJsZSBnbGFzcyBqYXIgd2l0aCBtZXRhbCBsaWQuPC9wPlwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjY1XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL0Zlcm1lbnRlZC1XaG9sZWdyYWluLU5ha2VkLUJhcmxleS1TcG9vbi0xNjAweDEwMDBfZDZmZWEwOTItZmRlNC00YTk4LWJlYzgtYmIzY2EwYTFmZDRkLmpwZz92PTE2Nzc3NjA4NjBcIixcImRmYy1iOm5hbWVcIjpcIkZlcm1lbnRlZCBOYWtlZCBCYXJsZXkgLSBDYXNlLCA2IHggMTc1ZyAoamFyKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTE5NDczMzgxNjgzL2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4My9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4My9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOTU5CL0M2XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUxOTQ3MzM4MTY4My9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNjZcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MVwiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjU5XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL1BhY2stQ2FuLUJha2VkLUJlYW5zLTE4MDB4Nl9hNGQ1ODQ1OS1iZjUyLTQ4YTktYmFlNy04MDdmNDAzNWI4N2YuanBnP3Y9MTY3Nzc2MDc3N1wiLFwiZGZjLWI6bmFtZVwiOlwiQmFrZWQgQnJpdGlzaCBCZWFucyAoVG9MKSAtIENhc2UgLSAxMiB4IDQwMGcgY2Fuc1wiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3MjQ0ODUxL2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MS9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MS9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOQ0JCQ0RcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3MjQ0ODUxL29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI2MFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3Mjc3NjE5XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNDVcIixcImRmYy1iOmltYWdlXCI6XCJodHRwczovL2Nkbi5zaG9waWZ5LmNvbS9zL2ZpbGVzLzEvMDczMS84NDgzLzc5MzkvcHJvZHVjdHMvUGFjay1DYW4tQmFrZWQtQmVhbnMtMTgwMHg2X2E0ZDU4NDU5LWJmNTItNDhhOS1iYWU3LTgwN2Y0MDM1Yjg3Zi5qcGc/dj0xNjc3NzYwNzc3XCIsXCJkZmMtYjpuYW1lXCI6XCJCYWtlZCBCcml0aXNoIEJlYW5zIChUb0wpIC0gU2luZ2xlIC0gNDAwZyBjYW5cIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiTkNCQlQ0XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIjIwXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNDZcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpjb25zdW1lc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOVwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjczXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI3NzYxOS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86Yjc0XCIsXCJkZmMtYjpwcm9kdWNlc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyNzI0NDg1MVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvdHJhbnNmb3JtYXRpb25cIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRUcmFuc2Zvcm1hdGlvblwiLFwiZGZjLWI6aGFzSW5jb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI3Mjc3NjE5L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmhhc091dGNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2MjcyNzc2MTkvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODc4NDk0N1wiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjY3XCIsXCJkZmMtYjppbWFnZVwiOlwiaHR0cHM6Ly9jZG4uc2hvcGlmeS5jb20vcy9maWxlcy8xLzA3MzEvODQ4My83OTM5L3Byb2R1Y3RzL1dob2xlLUZhdmEtQmVhbnMtT3JnYW5pYy1DYW5uZWRfZmNiNjRmZDctOGNhMy00NjVhLThmNTYtNDQzY2YyOGUwYjcxLmpwZz92PTE2Nzc3NjA5NzdcIixcImRmYy1iOm5hbWVcIjpcIk9yZ2FuaWMgV2hvbGUgRmF2YSBCZWFucyBpbiBXYXRlciAoVG9MKSAtIENhc2UgLSAxMiB4IDQwMGcgY2Fuc1wiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3L2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODc4NDk0Ny9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODc4NDk0Ny9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJPQ0ZCQ0RcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4Nzg0OTQ3L29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI2OFwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1XCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNTNcIixcImRmYy1iOmltYWdlXCI6XCJodHRwczovL2Nkbi5zaG9waWZ5LmNvbS9zL2ZpbGVzLzEvMDczMS84NDgzLzc5MzkvcHJvZHVjdHMvV2hvbGUtRmF2YS1CZWFucy1PcmdhbmljLUNhbm5lZF9mY2I2NGZkNy04Y2EzLTQ2NWEtOGY1Ni00NDNjZjI4ZTBiNzEuanBnP3Y9MTY3Nzc2MDk3N1wiLFwiZGZjLWI6bmFtZVwiOlwiT3JnYW5pYyBXaG9sZSBGYXZhIEJlYW5zIGluIFdhdGVyIChUb0wpIC0gU2luZ2xlIC0gNDAwZyBjYW5cIixcImRmYy1iOnJlZmVyZW5jZWRCeVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9jYXRhbG9nSXRlbVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTUvY2F0YWxvZ0l0ZW1cIixcIkB0eXBlXCI6XCJkZmMtYjpDYXRhbG9nSXRlbVwiLFwiZGZjLWI6b2ZmZXJlZFRocm91Z2hcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTUvb2ZmZXJcIixcImRmYy1iOnNrdVwiOlwiT0NGQlQ0XCIsXCJkZmMtYjpzdG9ja0xpbWl0YXRpb25cIjpcIi0xXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9vZmZlclwiLFwiQHR5cGVcIjpcImRmYy1iOk9mZmVyXCIsXCJkZmMtYjpoYXNQcmljZVwiOntcIkBpZFwiOlwiXzpiNTRcIn19LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpjb25zdW1lc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNVwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjgxXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODgxNzcxNS9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjgyXCIsXCJkZmMtYjpwcm9kdWNlc1wiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTYyODc4NDk0N1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTUvdHJhbnNmb3JtYXRpb25cIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRUcmFuc2Zvcm1hdGlvblwiLFwiZGZjLWI6aGFzSW5jb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjI4ODE3NzE1L3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmhhc091dGNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2Mjg4MTc3MTUvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY1NDA0OTA3NVwiLFwiQHR5cGVcIjpcImRmYy1iOlN1cHBsaWVkUHJvZHVjdFwiLFwiZGZjLWI6aGFzUXVhbnRpdHlcIjpcIl86YjQ5XCIsXCJkZmMtYjpuYW1lXCI6XCJDYXJsaW4gUGVhcyBpbiBXYXRlciwgT3JnYW5pYyAoRElTVFJJQlVUT1IpIC0gUmV0YWlsIGNhbiAoNDAwZyBjYW4pXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk9DQ1BUNFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjUwXCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6Y29uc3VtZXNcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzVcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI3N1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwNDkwNzUvcGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkUHJvZHVjdGlvbkZsb3dcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI3OFwiLFwiZGZjLWI6cHJvZHVjZXNcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDNcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L3RyYW5zZm9ybWF0aW9uXCIsXCJAdHlwZVwiOlwiZGZjLWI6QXNQbGFubmVkVHJhbnNmb3JtYXRpb25cIixcImRmYy1iOmhhc0luY29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY1NDA0OTA3NS9wbGFubmVkQ29uc3VtcHRpb25GbG93XCIsXCJkZmMtYjpoYXNPdXRjb21lXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDQ5MDc1L3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDNcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI2M1wiLFwiZGZjLWI6bmFtZVwiOlwiQ2FybGluIFBlYXMgaW4gV2F0ZXIsIE9yZ2FuaWMgKERJU1RSSUJVVE9SKSAtIFN0YW5kYXJkIGNhc2UgKDEyIHggNDAwZyBjYW4pXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDMvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDgxODQzL2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjU0MDgxODQzL29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk9DQ1BDRFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NTQwODE4NDMvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjY0XCJ9fSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM1ODQ1NjNcIixcIkB0eXBlXCI6XCJkZmMtYjpTdXBwbGllZFByb2R1Y3RcIixcImRmYy1iOmhhc1F1YW50aXR5XCI6XCJfOmI1NVwiLFwiZGZjLWI6bmFtZVwiOlwiUm9hc3RlZCBGYXZhIEJlYW5zLCBMaWdodGx5IFNlYSBTYWx0ZWQgKERJU1RSSUJVVE9SKSAtIFJldGFpbCBwYWNrICgzMDBnKVwiLFwiZGZjLWI6cmVmZXJlbmNlZEJ5XCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL2NhdGFsb2dJdGVtXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9jYXRhbG9nSXRlbVwiLFwiQHR5cGVcIjpcImRmYy1iOkNhdGFsb2dJdGVtXCIsXCJkZmMtYjpvZmZlcmVkVGhyb3VnaFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9vZmZlclwiLFwiZGZjLWI6c2t1XCI6XCJOUkZTUjNcIixcImRmYy1iOnN0b2NrTGltaXRhdGlvblwiOlwiLTFcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL29mZmVyXCIsXCJAdHlwZVwiOlwiZGZjLWI6T2ZmZXJcIixcImRmYy1iOmhhc1ByaWNlXCI6e1wiQGlkXCI6XCJfOmI1NlwifX0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL3BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcIkB0eXBlXCI6XCJkZmMtYjpBc1BsYW5uZWRDb25zdW1wdGlvbkZsb3dcIixcImRmYy1iOmNvbnN1bWVzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzXCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiODNcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNTg0NTYzL3BsYW5uZWRQcm9kdWN0aW9uRmxvd1wiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFByb2R1Y3Rpb25GbG93XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiODRcIixcImRmYy1iOnByb2R1Y2VzXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxXCJ9LHtcIkBpZFwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My90cmFuc2Zvcm1hdGlvblwiLFwiQHR5cGVcIjpcImRmYy1iOkFzUGxhbm5lZFRyYW5zZm9ybWF0aW9uXCIsXCJkZmMtYjpoYXNJbmNvbWVcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM1ODQ1NjMvcGxhbm5lZENvbnN1bXB0aW9uRmxvd1wiLFwiZGZjLWI6aGFzT3V0Y29tZVwiOlwiaHR0cHM6Ly9mb29kLWRhdGEtY29sbGFib3JhdGlvbi1wcm9kdWMtZmU4NzAxNTJmNjM0Lmhlcm9rdWFwcC5jb20vcHJvZHVjdC80NDUyNTY2MzU4NDU2My9wbGFubmVkUHJvZHVjdGlvbkZsb3dcIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxXCIsXCJAdHlwZVwiOlwiZGZjLWI6U3VwcGxpZWRQcm9kdWN0XCIsXCJkZmMtYjpoYXNRdWFudGl0eVwiOlwiXzpiNjlcIixcImRmYy1iOm5hbWVcIjpcIlJvYXN0ZWQgRmF2YSBCZWFucywgTGlnaHRseSBTZWEgU2FsdGVkIChESVNUUklCVVRPUikgLSBTdGFuZGFyZCBjYXNlICgxMCB4IDMwMGcpXCIsXCJkZmMtYjpyZWZlcmVuY2VkQnlcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM2MTczMzEvY2F0YWxvZ0l0ZW1cIn0se1wiQGlkXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxL2NhdGFsb2dJdGVtXCIsXCJAdHlwZVwiOlwiZGZjLWI6Q2F0YWxvZ0l0ZW1cIixcImRmYy1iOm9mZmVyZWRUaHJvdWdoXCI6XCJodHRwczovL2Zvb2QtZGF0YS1jb2xsYWJvcmF0aW9uLXByb2R1Yy1mZTg3MDE1MmY2MzQuaGVyb2t1YXBwLmNvbS9wcm9kdWN0LzQ0NTI1NjYzNjE3MzMxL29mZmVyXCIsXCJkZmMtYjpza3VcIjpcIk5SRlNDWFwiLFwiZGZjLWI6c3RvY2tMaW1pdGF0aW9uXCI6XCItMVwifSx7XCJAaWRcIjpcImh0dHBzOi8vZm9vZC1kYXRhLWNvbGxhYm9yYXRpb24tcHJvZHVjLWZlODcwMTUyZjYzNC5oZXJva3VhcHAuY29tL3Byb2R1Y3QvNDQ1MjU2NjM2MTczMzEvb2ZmZXJcIixcIkB0eXBlXCI6XCJkZmMtYjpPZmZlclwiLFwiZGZjLWI6aGFzUHJpY2VcIjp7XCJAaWRcIjpcIl86YjcwXCJ9fV19IiwibGFzdElkIjoiODE0NzI5MjI1ODYxMSIsInJlbWFpbmluZ1Byb2R1Y3RzQ291bnRBZnRlciI6MCwic3VjY2VzcyI6dHJ1ZSwibWVzc2FnZSI6IlByb2R1Y3RzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkifQ== + recorded_at: Fri, 24 May 2024 01:48:50 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml new file mode 100644 index 00000000000..a457dd85fea --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -0,0 +1,632 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4000000000006975&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_sojXClxhQQaFbW","request_duration_ms":394}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:59 GMT + Content-Type: + - application/json + Content-Length: + - '996' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 22e0121b-31af-4767-b4ae-cd488f756d92 + Original-Request: + - req_rLIXRkYVBfZDQW + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_rLIXRkYVBfZDQW + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hR9KuuB1fWySnujBh02U7", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "WoxwxVPUPcg0EjXW", + "funding": "credit", + "generated_from": null, + "last4": "6975", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871379, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:59 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_rLIXRkYVBfZDQW","request_duration_ms":453}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:59 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 78275c47-0297-4c0e-a239-98563992887d + Original-Request: + - req_GVnMFgqWxAysaQ + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_GVnMFgqWxAysaQ + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyekV1ShGBjY8G", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871379, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "84F0FD2D", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:59 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hR9KuuB1fWySnujBh02U7&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekV1ShGBjY8G&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_GVnMFgqWxAysaQ","request_duration_ms":429}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:23:00 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 162743d2-74b2-4292-a1ee-0bc2bb6a4801 + Original-Request: + - req_zlPjMc54Tkbu9m + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_zlPjMc54Tkbu9m + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hR9KuuB1fWySn1nJd2Z0s", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871379, + "currency": "eur", + "customer": "cus_PyekV1ShGBjY8G", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hR9KuuB1fWySnujBh02U7", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:23:00 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hR9KuuB1fWySn1nJd2Z0s/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_zlPjMc54Tkbu9m","request_duration_ms":487}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 402 + message: Payment Required + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:23:01 GMT + Content-Type: + - application/json + Content-Length: + - '5051' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 5a61ef34-70b9-4d94-a0d7-47616a39b2b4 + Original-Request: + - req_fyMzG745GeHI6Y + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_fyMzG745GeHI6Y + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: | + { + "error": { + "charge": "ch_3P8hR9KuuB1fWySn1n33UgF4", + "code": "card_declined", + "decline_code": "card_velocity_exceeded", + "doc_url": "https://stripe.com/docs/error-codes/card-declined", + "message": "Your card was declined for making repeated attempts too frequently or exceeding its amount limit.", + "payment_intent": { + "id": "pi_3P8hR9KuuB1fWySn1nJd2Z0s", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": { + } + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871379, + "currency": "eur", + "customer": "cus_PyekV1ShGBjY8G", + "description": null, + "invoice": null, + "last_payment_error": { + "charge": "ch_3P8hR9KuuB1fWySn1n33UgF4", + "code": "card_declined", + "decline_code": "card_velocity_exceeded", + "doc_url": "https://stripe.com/docs/error-codes/card-declined", + "message": "Your card was declined for making repeated attempts too frequently or exceeding its amount limit.", + "payment_method": { + "id": "pm_1P8hR9KuuB1fWySnujBh02U7", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "WoxwxVPUPcg0EjXW", + "funding": "credit", + "generated_from": null, + "last4": "6975", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871379, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "type": "card_error" + }, + "latest_charge": "ch_3P8hR9KuuB1fWySn1n33UgF4", + "livemode": false, + "metadata": { + }, + "next_action": null, + "on_behalf_of": null, + "payment_method": null, + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_payment_method", + "transfer_data": null, + "transfer_group": null + }, + "payment_method": { + "id": "pm_1P8hR9KuuB1fWySnujBh02U7", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "WoxwxVPUPcg0EjXW", + "funding": "credit", + "generated_from": null, + "last4": "6975", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871379, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "request_log_url": "https://dashboard.stripe.com/test/logs/req_fyMzG745GeHI6Y?t=1713871380", + "type": "card_error" + } + } + recorded_at: Tue, 23 Apr 2024 11:23:01 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml new file mode 100644 index 00000000000..077dc39ebc7 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -0,0 +1,632 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4000000000000069&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_M2EjGTJOmFPvjA","request_duration_ms":413}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:51 GMT + Content-Type: + - application/json + Content-Length: + - '996' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 178dad88-b557-4875-bbfa-d9ecfdfb98b5 + Original-Request: + - req_bqKC4w4oOMZvSc + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_bqKC4w4oOMZvSc + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hR1KuuB1fWySnbxi4nn24", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "qpQikrTL7IyNA2rE", + "funding": "credit", + "generated_from": null, + "last4": "0069", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871371, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:51 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_bqKC4w4oOMZvSc","request_duration_ms":533}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:52 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 5835fb77-1637-4a76-ad9d-792b3db11f50 + Original-Request: + - req_SfQyNVeNfePrtc + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_SfQyNVeNfePrtc + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyekuTW9G8teWh", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871371, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "0A1B36ED", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:52 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hR1KuuB1fWySnbxi4nn24&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekuTW9G8teWh&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_SfQyNVeNfePrtc","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:52 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 0a884fa9-98f8-4aa7-baaf-0c03ef7042ea + Original-Request: + - req_YNJjarvaZJsYcl + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_YNJjarvaZJsYcl + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hR2KuuB1fWySn2lcIMkzA", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871372, + "currency": "eur", + "customer": "cus_PyekuTW9G8teWh", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hR1KuuB1fWySnbxi4nn24", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:52 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hR2KuuB1fWySn2lcIMkzA/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_YNJjarvaZJsYcl","request_duration_ms":510}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 402 + message: Payment Required + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:53 GMT + Content-Type: + - application/json + Content-Length: + - '4857' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - f6345948-00a4-4462-a7ad-6b2c14710441 + Original-Request: + - req_a226IErp01tmAg + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_a226IErp01tmAg + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: | + { + "error": { + "charge": "ch_3P8hR2KuuB1fWySn2Q4UrurZ", + "code": "expired_card", + "doc_url": "https://stripe.com/docs/error-codes/expired-card", + "message": "Your card has expired.", + "param": "exp_month", + "payment_intent": { + "id": "pi_3P8hR2KuuB1fWySn2lcIMkzA", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": { + } + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871372, + "currency": "eur", + "customer": "cus_PyekuTW9G8teWh", + "description": null, + "invoice": null, + "last_payment_error": { + "charge": "ch_3P8hR2KuuB1fWySn2Q4UrurZ", + "code": "expired_card", + "doc_url": "https://stripe.com/docs/error-codes/expired-card", + "message": "Your card has expired.", + "param": "exp_month", + "payment_method": { + "id": "pm_1P8hR1KuuB1fWySnbxi4nn24", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "qpQikrTL7IyNA2rE", + "funding": "credit", + "generated_from": null, + "last4": "0069", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871371, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "type": "card_error" + }, + "latest_charge": "ch_3P8hR2KuuB1fWySn2Q4UrurZ", + "livemode": false, + "metadata": { + }, + "next_action": null, + "on_behalf_of": null, + "payment_method": null, + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_payment_method", + "transfer_data": null, + "transfer_group": null + }, + "payment_method": { + "id": "pm_1P8hR1KuuB1fWySnbxi4nn24", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "qpQikrTL7IyNA2rE", + "funding": "credit", + "generated_from": null, + "last4": "0069", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871371, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "request_log_url": "https://dashboard.stripe.com/test/logs/req_a226IErp01tmAg?t=1713871372", + "type": "card_error" + } + } + recorded_at: Tue, 23 Apr 2024 11:22:53 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml new file mode 100644 index 00000000000..c1529614fc9 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -0,0 +1,632 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4000000000000002&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_jw6WIU0GBeVnT2","request_duration_ms":406}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:41 GMT + Content-Type: + - application/json + Content-Length: + - '996' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - b7635034-0538-409f-8de4-029495aa738e + Original-Request: + - req_17rocy9XEkwQk7 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_17rocy9XEkwQk7 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQrKuuB1fWySnoJXDVbMV", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "IKC2ubfpSLuZKsVs", + "funding": "credit", + "generated_from": null, + "last4": "0002", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871361, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:41 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_17rocy9XEkwQk7","request_duration_ms":445}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:41 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - ac92f435-bad8-453d-a832-6b6b01ea665d + Original-Request: + - req_hmFNjhNpTLnsD2 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_hmFNjhNpTLnsD2 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_Pyek1w8BYYKnV9", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871361, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "8824622E", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:41 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQrKuuB1fWySnoJXDVbMV&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyek1w8BYYKnV9&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_hmFNjhNpTLnsD2","request_duration_ms":503}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:42 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 24277f63-f991-44e9-a545-04e748071bf9 + Original-Request: + - req_9auOceZoxHo5tE + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_9auOceZoxHo5tE + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQsKuuB1fWySn0dRsCAlk", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871362, + "currency": "eur", + "customer": "cus_Pyek1w8BYYKnV9", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQrKuuB1fWySnoJXDVbMV", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:42 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQsKuuB1fWySn0dRsCAlk/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_9auOceZoxHo5tE","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 402 + message: Payment Required + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:43 GMT + Content-Type: + - application/json + Content-Length: + - '4889' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - df30ad1c-4cf2-4fef-a887-03a948f403da + Original-Request: + - req_d5nQ4wPD4E7f6U + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_d5nQ4wPD4E7f6U + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: | + { + "error": { + "charge": "ch_3P8hQsKuuB1fWySn02qML9H0", + "code": "card_declined", + "decline_code": "generic_decline", + "doc_url": "https://stripe.com/docs/error-codes/card-declined", + "message": "Your card was declined.", + "payment_intent": { + "id": "pi_3P8hQsKuuB1fWySn0dRsCAlk", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": { + } + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871362, + "currency": "eur", + "customer": "cus_Pyek1w8BYYKnV9", + "description": null, + "invoice": null, + "last_payment_error": { + "charge": "ch_3P8hQsKuuB1fWySn02qML9H0", + "code": "card_declined", + "decline_code": "generic_decline", + "doc_url": "https://stripe.com/docs/error-codes/card-declined", + "message": "Your card was declined.", + "payment_method": { + "id": "pm_1P8hQrKuuB1fWySnoJXDVbMV", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "IKC2ubfpSLuZKsVs", + "funding": "credit", + "generated_from": null, + "last4": "0002", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871361, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "type": "card_error" + }, + "latest_charge": "ch_3P8hQsKuuB1fWySn02qML9H0", + "livemode": false, + "metadata": { + }, + "next_action": null, + "on_behalf_of": null, + "payment_method": null, + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_payment_method", + "transfer_data": null, + "transfer_group": null + }, + "payment_method": { + "id": "pm_1P8hQrKuuB1fWySnoJXDVbMV", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "IKC2ubfpSLuZKsVs", + "funding": "credit", + "generated_from": null, + "last4": "0002", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871361, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "request_log_url": "https://dashboard.stripe.com/test/logs/req_d5nQ4wPD4E7f6U?t=1713871362", + "type": "card_error" + } + } + recorded_at: Tue, 23 Apr 2024 11:22:43 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml new file mode 100644 index 00000000000..20386adda17 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -0,0 +1,632 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4000000000000127&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_YNJjarvaZJsYcl","request_duration_ms":510}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:54 GMT + Content-Type: + - application/json + Content-Length: + - '996' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 5be022b2-592a-457f-823e-4222727e3646 + Original-Request: + - req_SogiZHLOYlhFRn + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_SogiZHLOYlhFRn + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hR3KuuB1fWySnQyTSkSEY", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "eWmxEL5j3bNdPnK5", + "funding": "credit", + "generated_from": null, + "last4": "0127", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871374, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:54 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_SogiZHLOYlhFRn","request_duration_ms":443}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:54 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - d5888172-b4f9-4931-804d-a9e0743066f3 + Original-Request: + - req_6VS5p3Zquah6Lb + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_6VS5p3Zquah6Lb + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_Pyek0DFHdMA6i4", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871374, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "95A6066A", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:54 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hR3KuuB1fWySnQyTSkSEY&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyek0DFHdMA6i4&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_6VS5p3Zquah6Lb","request_duration_ms":480}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:55 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - cf247e80-4e3b-444d-b26a-74c85e463dae + Original-Request: + - req_XZhN6FLRgLDom3 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_XZhN6FLRgLDom3 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hR4KuuB1fWySn1FYBXndE", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871374, + "currency": "eur", + "customer": "cus_Pyek0DFHdMA6i4", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hR3KuuB1fWySnQyTSkSEY", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:55 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hR4KuuB1fWySn1FYBXndE/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_XZhN6FLRgLDom3","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 402 + message: Payment Required + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:56 GMT + Content-Type: + - application/json + Content-Length: + - '4883' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 856d1ab8-1e63-4ee5-8037-4b8ff021ddda + Original-Request: + - req_FXCmu1rrYkWjml + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_FXCmu1rrYkWjml + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: | + { + "error": { + "charge": "ch_3P8hR4KuuB1fWySn1ONLa92O", + "code": "incorrect_cvc", + "doc_url": "https://stripe.com/docs/error-codes/incorrect-cvc", + "message": "Your card's security code is incorrect.", + "param": "cvc", + "payment_intent": { + "id": "pi_3P8hR4KuuB1fWySn1FYBXndE", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": { + } + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871374, + "currency": "eur", + "customer": "cus_Pyek0DFHdMA6i4", + "description": null, + "invoice": null, + "last_payment_error": { + "charge": "ch_3P8hR4KuuB1fWySn1ONLa92O", + "code": "incorrect_cvc", + "doc_url": "https://stripe.com/docs/error-codes/incorrect-cvc", + "message": "Your card's security code is incorrect.", + "param": "cvc", + "payment_method": { + "id": "pm_1P8hR3KuuB1fWySnQyTSkSEY", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "fail" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "eWmxEL5j3bNdPnK5", + "funding": "credit", + "generated_from": null, + "last4": "0127", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871374, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "type": "card_error" + }, + "latest_charge": "ch_3P8hR4KuuB1fWySn1ONLa92O", + "livemode": false, + "metadata": { + }, + "next_action": null, + "on_behalf_of": null, + "payment_method": null, + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_payment_method", + "transfer_data": null, + "transfer_group": null + }, + "payment_method": { + "id": "pm_1P8hR3KuuB1fWySnQyTSkSEY", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "fail" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "eWmxEL5j3bNdPnK5", + "funding": "credit", + "generated_from": null, + "last4": "0127", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871374, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "request_log_url": "https://dashboard.stripe.com/test/logs/req_FXCmu1rrYkWjml?t=1713871375", + "type": "card_error" + } + } + recorded_at: Tue, 23 Apr 2024 11:22:56 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml new file mode 100644 index 00000000000..23a3cf8bfa6 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -0,0 +1,632 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4000000000009995&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_9auOceZoxHo5tE","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:43 GMT + Content-Type: + - application/json + Content-Length: + - '996' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - efb26086-55ca-4fed-96f9-712e811983b5 + Original-Request: + - req_JFuZ8mpCSSE39O + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_JFuZ8mpCSSE39O + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQtKuuB1fWySnkWg8Yi12", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "O0I0muUGQBJy3p73", + "funding": "credit", + "generated_from": null, + "last4": "9995", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871363, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:43 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_JFuZ8mpCSSE39O","request_duration_ms":485}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:44 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - d6655148-6ed2-47b6-ba01-38b8bb4a198d + Original-Request: + - req_f8LoVSm6ehzIOQ + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_f8LoVSm6ehzIOQ + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_Pyekp6fXoSyo4f", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871364, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "B923F253", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:44 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQtKuuB1fWySnkWg8Yi12&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyekp6fXoSyo4f&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_f8LoVSm6ehzIOQ","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:44 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - d797d3c9-2865-44b3-bf91-76176a96bf24 + Original-Request: + - req_7nTlJ3fHIjzIPN + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_7nTlJ3fHIjzIPN + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQuKuuB1fWySn2YcCudO4", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871364, + "currency": "eur", + "customer": "cus_Pyekp6fXoSyo4f", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQtKuuB1fWySnkWg8Yi12", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:44 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQuKuuB1fWySn2YcCudO4/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_7nTlJ3fHIjzIPN","request_duration_ms":510}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 402 + message: Payment Required + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:45 GMT + Content-Type: + - application/json + Content-Length: + - '4915' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - f0b1f823-2b28-4b51-829e-030893bb1ce9 + Original-Request: + - req_Ua7pnZevBRWYWv + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_Ua7pnZevBRWYWv + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: | + { + "error": { + "charge": "ch_3P8hQuKuuB1fWySn2WZGczKx", + "code": "card_declined", + "decline_code": "insufficient_funds", + "doc_url": "https://stripe.com/docs/error-codes/card-declined", + "message": "Your card has insufficient funds.", + "payment_intent": { + "id": "pi_3P8hQuKuuB1fWySn2YcCudO4", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": { + } + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871364, + "currency": "eur", + "customer": "cus_Pyekp6fXoSyo4f", + "description": null, + "invoice": null, + "last_payment_error": { + "charge": "ch_3P8hQuKuuB1fWySn2WZGczKx", + "code": "card_declined", + "decline_code": "insufficient_funds", + "doc_url": "https://stripe.com/docs/error-codes/card-declined", + "message": "Your card has insufficient funds.", + "payment_method": { + "id": "pm_1P8hQtKuuB1fWySnkWg8Yi12", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "O0I0muUGQBJy3p73", + "funding": "credit", + "generated_from": null, + "last4": "9995", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871363, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "type": "card_error" + }, + "latest_charge": "ch_3P8hQuKuuB1fWySn2WZGczKx", + "livemode": false, + "metadata": { + }, + "next_action": null, + "on_behalf_of": null, + "payment_method": null, + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_payment_method", + "transfer_data": null, + "transfer_group": null + }, + "payment_method": { + "id": "pm_1P8hQtKuuB1fWySnkWg8Yi12", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "O0I0muUGQBJy3p73", + "funding": "credit", + "generated_from": null, + "last4": "9995", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871363, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "request_log_url": "https://dashboard.stripe.com/test/logs/req_Ua7pnZevBRWYWv?t=1713871364", + "type": "card_error" + } + } + recorded_at: Tue, 23 Apr 2024 11:22:45 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml new file mode 100644 index 00000000000..ace8a4fe2d5 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -0,0 +1,632 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4000000000009987&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_7nTlJ3fHIjzIPN","request_duration_ms":510}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:46 GMT + Content-Type: + - application/json + Content-Length: + - '996' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - dd89d6d5-1928-425b-9e41-0d0ddbaabd66 + Original-Request: + - req_qPbK8GWnufeusA + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_qPbK8GWnufeusA + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQwKuuB1fWySnnXjxt2Q5", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "hMDekBwrnWL1oLxe", + "funding": "credit", + "generated_from": null, + "last4": "9987", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871366, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:46 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_qPbK8GWnufeusA","request_duration_ms":446}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:46 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 8fa0ce75-bb64-4ed0-be30-0937ff2b8d3e + Original-Request: + - req_29DQjMmwvNd48X + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_29DQjMmwvNd48X + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyekDsErN9ufoM", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871366, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "1AB5687C", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:46 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQwKuuB1fWySnnXjxt2Q5&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekDsErN9ufoM&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_29DQjMmwvNd48X","request_duration_ms":508}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:47 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - c99be1bc-4a15-4ef0-9097-fd46b3b284f1 + Original-Request: + - req_aGW6Vn9eCXjmi7 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_aGW6Vn9eCXjmi7 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQxKuuB1fWySn1iZusZS1", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871367, + "currency": "eur", + "customer": "cus_PyekDsErN9ufoM", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQwKuuB1fWySnnXjxt2Q5", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:47 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQxKuuB1fWySn1iZusZS1/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_aGW6Vn9eCXjmi7","request_duration_ms":498}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 402 + message: Payment Required + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:48 GMT + Content-Type: + - application/json + Content-Length: + - '4877' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 2ee34069-f3f4-4ff7-b5dc-51348b21ddef + Original-Request: + - req_tE5NggyuH84Bwp + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_tE5NggyuH84Bwp + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: | + { + "error": { + "charge": "ch_3P8hQxKuuB1fWySn1mkDmi3i", + "code": "card_declined", + "decline_code": "lost_card", + "doc_url": "https://stripe.com/docs/error-codes/card-declined", + "message": "Your card was declined.", + "payment_intent": { + "id": "pi_3P8hQxKuuB1fWySn1iZusZS1", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": { + } + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871367, + "currency": "eur", + "customer": "cus_PyekDsErN9ufoM", + "description": null, + "invoice": null, + "last_payment_error": { + "charge": "ch_3P8hQxKuuB1fWySn1mkDmi3i", + "code": "card_declined", + "decline_code": "lost_card", + "doc_url": "https://stripe.com/docs/error-codes/card-declined", + "message": "Your card was declined.", + "payment_method": { + "id": "pm_1P8hQwKuuB1fWySnnXjxt2Q5", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "hMDekBwrnWL1oLxe", + "funding": "credit", + "generated_from": null, + "last4": "9987", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871366, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "type": "card_error" + }, + "latest_charge": "ch_3P8hQxKuuB1fWySn1mkDmi3i", + "livemode": false, + "metadata": { + }, + "next_action": null, + "on_behalf_of": null, + "payment_method": null, + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_payment_method", + "transfer_data": null, + "transfer_group": null + }, + "payment_method": { + "id": "pm_1P8hQwKuuB1fWySnnXjxt2Q5", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "hMDekBwrnWL1oLxe", + "funding": "credit", + "generated_from": null, + "last4": "9987", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871366, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "request_log_url": "https://dashboard.stripe.com/test/logs/req_tE5NggyuH84Bwp?t=1713871367", + "type": "card_error" + } + } + recorded_at: Tue, 23 Apr 2024 11:22:48 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml new file mode 100644 index 00000000000..df960e5ab81 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -0,0 +1,630 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4000000000000119&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_XZhN6FLRgLDom3","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:56 GMT + Content-Type: + - application/json + Content-Length: + - '996' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 4fde0975-18cb-4a02-9522-870f259bb1da + Original-Request: + - req_gd1J4ZPBCCug9x + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_gd1J4ZPBCCug9x + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hR6KuuB1fWySnbrsC9UJ6", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "9HWWxe4EyniQy61z", + "funding": "credit", + "generated_from": null, + "last4": "0119", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871376, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:56 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_gd1J4ZPBCCug9x","request_duration_ms":535}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:57 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - d325710f-8b58-405e-9f71-bf77f88ab4b8 + Original-Request: + - req_2YAwLlhn1Wwsms + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_2YAwLlhn1Wwsms + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyekmaUZEsfvMy", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871377, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "E9D00917", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:57 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hR6KuuB1fWySnbrsC9UJ6&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekmaUZEsfvMy&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_2YAwLlhn1Wwsms","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:57 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - c9d7fb8c-89f1-4453-bf7b-8d895ae3db51 + Original-Request: + - req_sojXClxhQQaFbW + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_sojXClxhQQaFbW + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hR7KuuB1fWySn1TR0go8r", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871377, + "currency": "eur", + "customer": "cus_PyekmaUZEsfvMy", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hR6KuuB1fWySnbrsC9UJ6", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:57 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hR7KuuB1fWySn1TR0go8r/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_sojXClxhQQaFbW","request_duration_ms":394}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 402 + message: Payment Required + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:58 GMT + Content-Type: + - application/json + Content-Length: + - '4917' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 58fced99-2bea-4f22-aeff-3c29242fc17c + Original-Request: + - req_D19RydovrPMO35 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_D19RydovrPMO35 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: | + { + "error": { + "charge": "ch_3P8hR7KuuB1fWySn1QTbIwTK", + "code": "processing_error", + "doc_url": "https://stripe.com/docs/error-codes/processing-error", + "message": "An error occurred while processing your card. Try again in a little bit.", + "payment_intent": { + "id": "pi_3P8hR7KuuB1fWySn1TR0go8r", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": { + } + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871377, + "currency": "eur", + "customer": "cus_PyekmaUZEsfvMy", + "description": null, + "invoice": null, + "last_payment_error": { + "charge": "ch_3P8hR7KuuB1fWySn1QTbIwTK", + "code": "processing_error", + "doc_url": "https://stripe.com/docs/error-codes/processing-error", + "message": "An error occurred while processing your card. Try again in a little bit.", + "payment_method": { + "id": "pm_1P8hR6KuuB1fWySnbrsC9UJ6", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "9HWWxe4EyniQy61z", + "funding": "credit", + "generated_from": null, + "last4": "0119", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871376, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "type": "card_error" + }, + "latest_charge": "ch_3P8hR7KuuB1fWySn1QTbIwTK", + "livemode": false, + "metadata": { + }, + "next_action": null, + "on_behalf_of": null, + "payment_method": null, + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_payment_method", + "transfer_data": null, + "transfer_group": null + }, + "payment_method": { + "id": "pm_1P8hR6KuuB1fWySnbrsC9UJ6", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "9HWWxe4EyniQy61z", + "funding": "credit", + "generated_from": null, + "last4": "0119", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871376, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "request_log_url": "https://dashboard.stripe.com/test/logs/req_D19RydovrPMO35?t=1713871377", + "type": "card_error" + } + } + recorded_at: Tue, 23 Apr 2024 11:22:58 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml new file mode 100644 index 00000000000..151fd5e6cea --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -0,0 +1,632 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4000000000009979&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_aGW6Vn9eCXjmi7","request_duration_ms":498}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:48 GMT + Content-Type: + - application/json + Content-Length: + - '996' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 517ec7db-a996-4cba-9172-f86e41046730 + Original-Request: + - req_h1DaNRQAhqFgz9 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_h1DaNRQAhqFgz9 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQyKuuB1fWySnCgvttCSO", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "1pjhEFFOW1eCi1AB", + "funding": "credit", + "generated_from": null, + "last4": "9979", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871368, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:48 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_h1DaNRQAhqFgz9","request_duration_ms":413}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:49 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - cb7724a0-993d-47f7-960f-f63acaac72e2 + Original-Request: + - req_sIi1TlK5XDpKSt + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_sIi1TlK5XDpKSt + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyekDa34UUgaBy", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871369, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "542CB18D", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:49 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQyKuuB1fWySnCgvttCSO&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekDa34UUgaBy&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_sIi1TlK5XDpKSt","request_duration_ms":522}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:49 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - e9749b76-4a91-4707-be17-a771d0f94596 + Original-Request: + - req_M2EjGTJOmFPvjA + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_M2EjGTJOmFPvjA + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQzKuuB1fWySn2Tv4Uyhb", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871369, + "currency": "eur", + "customer": "cus_PyekDa34UUgaBy", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQyKuuB1fWySnCgvttCSO", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:49 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQzKuuB1fWySn2Tv4Uyhb/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_M2EjGTJOmFPvjA","request_duration_ms":413}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 402 + message: Payment Required + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:50 GMT + Content-Type: + - application/json + Content-Length: + - '4881' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 204e1661-6051-4cd8-a5e2-e8c923a871d0 + Original-Request: + - req_SMrYdbWXABS1Ya + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_SMrYdbWXABS1Ya + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: | + { + "error": { + "charge": "ch_3P8hQzKuuB1fWySn2DGsgH8G", + "code": "card_declined", + "decline_code": "stolen_card", + "doc_url": "https://stripe.com/docs/error-codes/card-declined", + "message": "Your card was declined.", + "payment_intent": { + "id": "pi_3P8hQzKuuB1fWySn2Tv4Uyhb", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": { + } + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871369, + "currency": "eur", + "customer": "cus_PyekDa34UUgaBy", + "description": null, + "invoice": null, + "last_payment_error": { + "charge": "ch_3P8hQzKuuB1fWySn2DGsgH8G", + "code": "card_declined", + "decline_code": "stolen_card", + "doc_url": "https://stripe.com/docs/error-codes/card-declined", + "message": "Your card was declined.", + "payment_method": { + "id": "pm_1P8hQyKuuB1fWySnCgvttCSO", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "1pjhEFFOW1eCi1AB", + "funding": "credit", + "generated_from": null, + "last4": "9979", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871368, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "type": "card_error" + }, + "latest_charge": "ch_3P8hQzKuuB1fWySn2DGsgH8G", + "livemode": false, + "metadata": { + }, + "next_action": null, + "on_behalf_of": null, + "payment_method": null, + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_payment_method", + "transfer_data": null, + "transfer_group": null + }, + "payment_method": { + "id": "pm_1P8hQyKuuB1fWySnCgvttCSO", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "pass" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "1pjhEFFOW1eCi1AB", + "funding": "credit", + "generated_from": null, + "last4": "9979", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871368, + "customer": null, + "livemode": false, + "metadata": { + }, + "type": "card" + }, + "request_log_url": "https://dashboard.stripe.com/test/logs/req_SMrYdbWXABS1Ya?t=1713871370", + "type": "card_error" + } + } + recorded_at: Tue, 23 Apr 2024 11:22:51 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml new file mode 100644 index 00000000000..3f6c5367307 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=378282246310005&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_WWwLrQp4sVqJV4","request_duration_ms":1003}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:34 GMT + Content-Type: + - application/json + Content-Length: + - '1009' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 4bd1d110-3526-486a-8c1f-e9deec2604d3 + Original-Request: + - req_q3SMRET2pdEU3x + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_q3SMRET2pdEU3x + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPlKuuB1fWySnRO8H7pVp", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "amex", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "american_express", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "zYCOiuhqkk4w2g2M", + "funding": "credit", + "generated_from": null, + "last4": "0005", + "networks": { + "available": [ + "amex" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": false + }, + "wallet": null + }, + "created": 1713871294, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:34 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_q3SMRET2pdEU3x","request_duration_ms":519}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:34 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 0f4ad5da-12eb-46f3-93f9-27728fff5b96 + Original-Request: + - req_sO5qBMluUDTjVx + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_sO5qBMluUDTjVx + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejlhPSbHpRU7", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871294, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "1FD8C6AE", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:34 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPlKuuB1fWySnRO8H7pVp&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejlhPSbHpRU7&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_sO5qBMluUDTjVx","request_duration_ms":410}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:35 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 30d95687-1376-4eb3-890c-9becd6c87be8 + Original-Request: + - req_swH0esqzotIIDC + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_swH0esqzotIIDC + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPmKuuB1fWySn0I96SqZc", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871294, + "currency": "eur", + "customer": "cus_PyejlhPSbHpRU7", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPlKuuB1fWySnRO8H7pVp", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:35 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPmKuuB1fWySn0I96SqZc/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_swH0esqzotIIDC","request_duration_ms":404}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:36 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - ce2ff524-3c64-4512-94eb-e683354019be + Original-Request: + - req_GtduzogqOBxFuM + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_GtduzogqOBxFuM + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPmKuuB1fWySn0I96SqZc", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871294, + "currency": "eur", + "customer": "cus_PyejlhPSbHpRU7", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPmKuuB1fWySn0TCXtFhe", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPlKuuB1fWySnRO8H7pVp", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:36 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPmKuuB1fWySn0I96SqZc + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_GtduzogqOBxFuM","request_duration_ms":1107}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:36 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_KxAzk5rtNpzTnE + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPmKuuB1fWySn0I96SqZc", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871294, + "currency": "eur", + "customer": "cus_PyejlhPSbHpRU7", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPmKuuB1fWySn0TCXtFhe", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPlKuuB1fWySnRO8H7pVp", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:36 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPmKuuB1fWySn0I96SqZc/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_KxAzk5rtNpzTnE","request_duration_ms":340}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:37 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - dbae392b-f0f0-4340-8072-bcd42a6f6be2 + Original-Request: + - req_rQgUbXQNdBUTkf + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_rQgUbXQNdBUTkf + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPmKuuB1fWySn0I96SqZc", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871294, + "currency": "eur", + "customer": "cus_PyejlhPSbHpRU7", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPmKuuB1fWySn0TCXtFhe", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPlKuuB1fWySnRO8H7pVp", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:37 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPmKuuB1fWySn0I96SqZc + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_rQgUbXQNdBUTkf","request_duration_ms":1188}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:38 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_UddWo6oZ6xRVWD + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPmKuuB1fWySn0I96SqZc", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871294, + "currency": "eur", + "customer": "cus_PyejlhPSbHpRU7", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPmKuuB1fWySn0TCXtFhe", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPlKuuB1fWySnRO8H7pVp", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:38 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..89dcaddff6b --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=378282246310005&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_ZmshM8deU5LJ8a","request_duration_ms":394}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:31 GMT + Content-Type: + - application/json + Content-Length: + - '1009' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - e5a0531c-6e6e-44c8-8f5f-b20454feb897 + Original-Request: + - req_zp9rWUux4NmCmn + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_zp9rWUux4NmCmn + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPjKuuB1fWySnB1rKwJD0", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "amex", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "american_express", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "zYCOiuhqkk4w2g2M", + "funding": "credit", + "generated_from": null, + "last4": "0005", + "networks": { + "available": [ + "amex" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": false + }, + "wallet": null + }, + "created": 1713871291, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:31 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_zp9rWUux4NmCmn","request_duration_ms":438}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:31 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - a7047b65-30fd-4a71-afe8-8f3e8dbeed4f + Original-Request: + - req_VvION4praYlJd6 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_VvION4praYlJd6 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_Pyej8RAVLLQG5C", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871291, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "645B7506", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:31 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPjKuuB1fWySnB1rKwJD0&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyej8RAVLLQG5C&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_VvION4praYlJd6","request_duration_ms":508}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:32 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 0174c247-8161-42c0-bf3f-877cd2f644f8 + Original-Request: + - req_knV0kmLqcT8rO2 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_knV0kmLqcT8rO2 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPkKuuB1fWySn2fu1bxGF", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871292, + "currency": "eur", + "customer": "cus_Pyej8RAVLLQG5C", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPjKuuB1fWySnB1rKwJD0", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:32 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPkKuuB1fWySn2fu1bxGF/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_knV0kmLqcT8rO2","request_duration_ms":407}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:33 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 4efb4540-e365-4044-8eb2-784ae473d9e1 + Original-Request: + - req_WWwLrQp4sVqJV4 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_WWwLrQp4sVqJV4 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPkKuuB1fWySn2fu1bxGF", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871292, + "currency": "eur", + "customer": "cus_Pyej8RAVLLQG5C", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPkKuuB1fWySn2NxNRLd1", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPjKuuB1fWySnB1rKwJD0", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:33 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml new file mode 100644 index 00000000000..d14e8d7e581 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=6555900000604105&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_nanZFhzRIre71v","request_duration_ms":1077}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:13 GMT + Content-Type: + - application/json + Content-Length: + - '1008' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 07fd64c4-4b06-4b4d-83fb-9a6c5b1b21a5 + Original-Request: + - req_h4FbCjxiOZzc6u + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_h4FbCjxiOZzc6u + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQOKuuB1fWySnId2Mzj5C", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "discover", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "discover", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "7NZ8adObS8Rw8HOq", + "funding": "credit", + "generated_from": null, + "last4": "4105", + "networks": { + "available": [ + "discover" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871333, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:13 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_h4FbCjxiOZzc6u","request_duration_ms":521}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:13 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 30499760-19e8-4a21-b9ef-40b16c04b75d + Original-Request: + - req_u5y0Bhoihunvpp + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_u5y0Bhoihunvpp + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejGREjSBtXbR", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871333, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "F625C654", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:13 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQOKuuB1fWySnId2Mzj5C&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejGREjSBtXbR&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_u5y0Bhoihunvpp","request_duration_ms":428}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:14 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 79383762-a38a-4a9d-abf2-f770269aed52 + Original-Request: + - req_nFRDi5kuAQt46x + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_nFRDi5kuAQt46x + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQPKuuB1fWySn2NE05rrF", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871333, + "currency": "eur", + "customer": "cus_PyejGREjSBtXbR", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQOKuuB1fWySnId2Mzj5C", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:14 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQPKuuB1fWySn2NE05rrF/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_nFRDi5kuAQt46x","request_duration_ms":421}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:15 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - e6b09ac4-d1fe-4409-a3d6-3fdd579d36eb + Original-Request: + - req_063fZXRL9juaTV + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_063fZXRL9juaTV + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQPKuuB1fWySn2NE05rrF", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871333, + "currency": "eur", + "customer": "cus_PyejGREjSBtXbR", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQPKuuB1fWySn2lFq97s5", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQOKuuB1fWySnId2Mzj5C", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:15 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQPKuuB1fWySn2NE05rrF + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_063fZXRL9juaTV","request_duration_ms":1167}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:15 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_PDviclwoOQJWDY + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQPKuuB1fWySn2NE05rrF", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871333, + "currency": "eur", + "customer": "cus_PyejGREjSBtXbR", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQPKuuB1fWySn2lFq97s5", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQOKuuB1fWySnId2Mzj5C", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:15 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQPKuuB1fWySn2NE05rrF/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_PDviclwoOQJWDY","request_duration_ms":406}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:17 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - dab6f1ca-f281-4ed8-8539-b77a10083c01 + Original-Request: + - req_TAyOFJqtk0XY4h + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_TAyOFJqtk0XY4h + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQPKuuB1fWySn2NE05rrF", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871333, + "currency": "eur", + "customer": "cus_PyejGREjSBtXbR", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQPKuuB1fWySn2lFq97s5", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQOKuuB1fWySnId2Mzj5C", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:17 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQPKuuB1fWySn2NE05rrF + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_TAyOFJqtk0XY4h","request_duration_ms":1635}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:17 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_3Dn9T1aixPSePK + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQPKuuB1fWySn2NE05rrF", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871333, + "currency": "eur", + "customer": "cus_PyejGREjSBtXbR", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQPKuuB1fWySn2lFq97s5", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQOKuuB1fWySnId2Mzj5C", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:17 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..2a07f9971ad --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=6555900000604105&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_wFzCMoF0mQD3Eo","request_duration_ms":315}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:10 GMT + Content-Type: + - application/json + Content-Length: + - '1008' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - d0482a80-5afc-44e9-9508-69dba3a1dd84 + Original-Request: + - req_HfCWuNBUeFJHJ5 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_HfCWuNBUeFJHJ5 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQMKuuB1fWySnN4KTfpDk", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "discover", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "discover", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "7NZ8adObS8Rw8HOq", + "funding": "credit", + "generated_from": null, + "last4": "4105", + "networks": { + "available": [ + "discover" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871330, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:10 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_HfCWuNBUeFJHJ5","request_duration_ms":415}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:10 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - ea256470-3297-4e6b-9052-5efcae4a7ffd + Original-Request: + - req_3gAE50rFEVax5i + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_3gAE50rFEVax5i + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejoBfFWODSMx", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871330, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "4A967218", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:10 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQMKuuB1fWySnN4KTfpDk&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejoBfFWODSMx&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_3gAE50rFEVax5i","request_duration_ms":524}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:11 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 17e39583-5976-4667-9d1a-223dedd14257 + Original-Request: + - req_JJ9t7V8lKdZpqY + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_JJ9t7V8lKdZpqY + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQNKuuB1fWySn0piyeLve", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871331, + "currency": "eur", + "customer": "cus_PyejoBfFWODSMx", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQMKuuB1fWySnN4KTfpDk", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:11 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQNKuuB1fWySn0piyeLve/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_JJ9t7V8lKdZpqY","request_duration_ms":424}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:12 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 412cb586-8cff-44a6-b60b-3c9a0d6520ce + Original-Request: + - req_nanZFhzRIre71v + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_nanZFhzRIre71v + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQNKuuB1fWySn0piyeLve", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871331, + "currency": "eur", + "customer": "cus_PyejoBfFWODSMx", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQNKuuB1fWySn0Ub9RO8K", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQMKuuB1fWySnN4KTfpDk", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:12 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml new file mode 100644 index 00000000000..755b43fc3ec --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=3056930009020004&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_F0PIDyr31udtJ2","request_duration_ms":1001}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:58 GMT + Content-Type: + - application/json + Content-Length: + - '1008' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 699acfe0-14ca-4d60-bf0e-95f24bb5dbe9 + Original-Request: + - req_aMcxa09ry3qzsw + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_aMcxa09ry3qzsw + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQ9KuuB1fWySnYVsRisH4", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "diners", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "diners_club", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "8CvV2XFCUY7eGw6O", + "funding": "credit", + "generated_from": null, + "last4": "0004", + "networks": { + "available": [ + "diners" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": false + }, + "wallet": null + }, + "created": 1713871318, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:58 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_aMcxa09ry3qzsw","request_duration_ms":441}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:58 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 4a72f8a7-096b-4828-9483-fbeea0e6f79d + Original-Request: + - req_Y5bjaH6gkAKoVc + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_Y5bjaH6gkAKoVc + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejqoGIrbSloY", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871318, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "BCF7C75E", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:58 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQ9KuuB1fWySnYVsRisH4&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejqoGIrbSloY&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_Y5bjaH6gkAKoVc","request_duration_ms":500}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:59 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - b098ddc0-7aec-4d60-a9f6-b39e167e46e2 + Original-Request: + - req_JvotoTPIJvFb62 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_JvotoTPIJvFb62 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQAKuuB1fWySn2Gw633z1", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871318, + "currency": "eur", + "customer": "cus_PyejqoGIrbSloY", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ9KuuB1fWySnYVsRisH4", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:59 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQAKuuB1fWySn2Gw633z1/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_JvotoTPIJvFb62","request_duration_ms":510}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:00 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - d49d4520-df0d-4f17-9539-e1a9f2497be8 + Original-Request: + - req_MZZk8A3FLOZ2cj + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_MZZk8A3FLOZ2cj + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQAKuuB1fWySn2Gw633z1", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871318, + "currency": "eur", + "customer": "cus_PyejqoGIrbSloY", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQAKuuB1fWySn27CF3HHg", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ9KuuB1fWySnYVsRisH4", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:00 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQAKuuB1fWySn2Gw633z1 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_MZZk8A3FLOZ2cj","request_duration_ms":1102}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:00 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_dWgYeF8wvQey17 + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQAKuuB1fWySn2Gw633z1", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871318, + "currency": "eur", + "customer": "cus_PyejqoGIrbSloY", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQAKuuB1fWySn27CF3HHg", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ9KuuB1fWySnYVsRisH4", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:00 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQAKuuB1fWySn2Gw633z1/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_dWgYeF8wvQey17","request_duration_ms":407}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:01 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - ea0e4c9f-d5ad-442f-b105-3c30b9a77760 + Original-Request: + - req_rbJH0wjaebh0ma + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_rbJH0wjaebh0ma + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQAKuuB1fWySn2Gw633z1", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871318, + "currency": "eur", + "customer": "cus_PyejqoGIrbSloY", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQAKuuB1fWySn27CF3HHg", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ9KuuB1fWySnYVsRisH4", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:01 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQAKuuB1fWySn2Gw633z1 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_rbJH0wjaebh0ma","request_duration_ms":1225}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:02 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_xmdIy0xcA8ttbI + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQAKuuB1fWySn2Gw633z1", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871318, + "currency": "eur", + "customer": "cus_PyejqoGIrbSloY", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQAKuuB1fWySn27CF3HHg", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ9KuuB1fWySnYVsRisH4", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:02 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..6d81c41bc10 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=3056930009020004&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_p4PeKqmC2GcoAk","request_duration_ms":407}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:55 GMT + Content-Type: + - application/json + Content-Length: + - '1008' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 7fdcd9a1-34ee-4ce6-bbe0-759b5d7adf3a + Original-Request: + - req_ez8SRoPdvB73xw + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_ez8SRoPdvB73xw + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQ7KuuB1fWySnSVV0shzQ", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "diners", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "diners_club", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "8CvV2XFCUY7eGw6O", + "funding": "credit", + "generated_from": null, + "last4": "0004", + "networks": { + "available": [ + "diners" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": false + }, + "wallet": null + }, + "created": 1713871315, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:55 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_ez8SRoPdvB73xw","request_duration_ms":434}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:55 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 3da20bb0-4fdd-4457-aa5a-c0482452f61d + Original-Request: + - req_DTfU4F1qwYuKyu + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_DTfU4F1qwYuKyu + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejNRkCBsUcCT", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871315, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "3BD04305", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:55 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQ7KuuB1fWySnSVV0shzQ&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejNRkCBsUcCT&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_DTfU4F1qwYuKyu","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:56 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - d1c04eb7-242d-49e0-a4b7-ce8b4b7c86d3 + Original-Request: + - req_D4aNytWyNkrU1c + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_D4aNytWyNkrU1c + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQ8KuuB1fWySn0klY7sZZ", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871316, + "currency": "eur", + "customer": "cus_PyejNRkCBsUcCT", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ7KuuB1fWySnSVV0shzQ", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:56 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQ8KuuB1fWySn0klY7sZZ/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_D4aNytWyNkrU1c","request_duration_ms":407}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:57 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 846d130a-be48-4026-9e59-8b0c31c4ca0d + Original-Request: + - req_F0PIDyr31udtJ2 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_F0PIDyr31udtJ2 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQ8KuuB1fWySn0klY7sZZ", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871316, + "currency": "eur", + "customer": "cus_PyejNRkCBsUcCT", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQ8KuuB1fWySn0sIkyJo1", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ7KuuB1fWySnSVV0shzQ", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:57 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml new file mode 100644 index 00000000000..91f1d0046b1 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=36227206271667&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_y2bfu78HhF3dGA","request_duration_ms":1107}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:05 GMT + Content-Type: + - application/json + Content-Length: + - '1008' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 3148e7f5-db70-4dbb-9a75-194224932fca + Original-Request: + - req_iiefiwCR3youDU + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_iiefiwCR3youDU + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQHKuuB1fWySnutfeAg3o", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "diners", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "diners_club", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "gDlx6y9moRYkO83e", + "funding": "credit", + "generated_from": null, + "last4": "1667", + "networks": { + "available": [ + "diners" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": false + }, + "wallet": null + }, + "created": 1713871325, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:05 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_iiefiwCR3youDU","request_duration_ms":521}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:06 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - e3c2de6d-f8be-479d-8ecf-71a3ef0d48ca + Original-Request: + - req_cVFNyy30EQtvcC + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_cVFNyy30EQtvcC + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejYA0TC3ECno", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871326, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "21AF6C51", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:06 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQHKuuB1fWySnutfeAg3o&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejYA0TC3ECno&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_cVFNyy30EQtvcC","request_duration_ms":448}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:06 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 5bceb53d-e5f4-49eb-bfc2-79ed634ad8f5 + Original-Request: + - req_wFibir0ga44G9t + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_wFibir0ga44G9t + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQIKuuB1fWySn1V7vxE51", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871326, + "currency": "eur", + "customer": "cus_PyejYA0TC3ECno", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQHKuuB1fWySnutfeAg3o", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:06 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQIKuuB1fWySn1V7vxE51/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_wFibir0ga44G9t","request_duration_ms":415}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:07 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 77b39096-d434-42e4-a44a-1657bb9d9c30 + Original-Request: + - req_NSbeTZUD4OBDv7 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_NSbeTZUD4OBDv7 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQIKuuB1fWySn1V7vxE51", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871326, + "currency": "eur", + "customer": "cus_PyejYA0TC3ECno", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQIKuuB1fWySn1R60pYt8", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQHKuuB1fWySnutfeAg3o", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:07 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQIKuuB1fWySn1V7vxE51 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_NSbeTZUD4OBDv7","request_duration_ms":1055}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:08 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_1QKMjLvP9QmP3M + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQIKuuB1fWySn1V7vxE51", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871326, + "currency": "eur", + "customer": "cus_PyejYA0TC3ECno", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQIKuuB1fWySn1R60pYt8", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQHKuuB1fWySnutfeAg3o", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:08 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQIKuuB1fWySn1V7vxE51/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_1QKMjLvP9QmP3M","request_duration_ms":293}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:09 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 56bdbdb0-1282-4790-b9c0-3f13314ec128 + Original-Request: + - req_e6WjAta3RR7cDp + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_e6WjAta3RR7cDp + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQIKuuB1fWySn1V7vxE51", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871326, + "currency": "eur", + "customer": "cus_PyejYA0TC3ECno", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQIKuuB1fWySn1R60pYt8", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQHKuuB1fWySnutfeAg3o", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:09 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQIKuuB1fWySn1V7vxE51 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_e6WjAta3RR7cDp","request_duration_ms":1340}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:09 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_wFzCMoF0mQD3Eo + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQIKuuB1fWySn1V7vxE51", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871326, + "currency": "eur", + "customer": "cus_PyejYA0TC3ECno", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQIKuuB1fWySn1R60pYt8", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQHKuuB1fWySnutfeAg3o", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:09 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..5548728a170 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=36227206271667&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_xmdIy0xcA8ttbI","request_duration_ms":408}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:02 GMT + Content-Type: + - application/json + Content-Length: + - '1008' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 9e719516-d99d-4916-94dc-61f6f1c2fc81 + Original-Request: + - req_UMNO0XHfcOP271 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_UMNO0XHfcOP271 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQEKuuB1fWySnM0FueQDF", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "diners", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "diners_club", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "gDlx6y9moRYkO83e", + "funding": "credit", + "generated_from": null, + "last4": "1667", + "networks": { + "available": [ + "diners" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": false + }, + "wallet": null + }, + "created": 1713871322, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:03 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_UMNO0XHfcOP271","request_duration_ms":536}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:03 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 2181cbe0-9829-4395-89b9-3a0d98be464c + Original-Request: + - req_pzxTrEyqekgZUS + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_pzxTrEyqekgZUS + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejNJe0cHnW15", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871323, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "2415657D", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:03 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQEKuuB1fWySnM0FueQDF&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejNJe0cHnW15&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_pzxTrEyqekgZUS","request_duration_ms":440}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:03 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 55d32630-3ae8-4d1f-bf6a-da26931bb412 + Original-Request: + - req_SNphmAy0Qmq6jg + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_SNphmAy0Qmq6jg + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQFKuuB1fWySn1Fs1vGsh", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871323, + "currency": "eur", + "customer": "cus_PyejNJe0cHnW15", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQEKuuB1fWySnM0FueQDF", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:03 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQFKuuB1fWySn1Fs1vGsh/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_SNphmAy0Qmq6jg","request_duration_ms":474}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:04 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 8310a181-52c7-47b1-9d1d-13b2359eff49 + Original-Request: + - req_y2bfu78HhF3dGA + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_y2bfu78HhF3dGA + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQFKuuB1fWySn1Fs1vGsh", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871323, + "currency": "eur", + "customer": "cus_PyejNJe0cHnW15", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQFKuuB1fWySn1ChVQwX4", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQEKuuB1fWySnM0FueQDF", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:05 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml new file mode 100644 index 00000000000..a700c19bfe6 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=6011111111111117&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_cKclt9jUdynwP8","request_duration_ms":1113}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:42 GMT + Content-Type: + - application/json + Content-Length: + - '1008' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 1ffe4335-3659-40c5-ba72-4b256d9055bc + Original-Request: + - req_Etu4Q54XyJuLfH + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_Etu4Q54XyJuLfH + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPtKuuB1fWySnf5blcleZ", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "discover", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "discover", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "SJztPPlfyEUr9hdK", + "funding": "credit", + "generated_from": null, + "last4": "1117", + "networks": { + "available": [ + "discover" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871302, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:42 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_Etu4Q54XyJuLfH","request_duration_ms":500}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:42 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 490666bd-00c7-483c-b2d8-a68000ecbe6c + Original-Request: + - req_SJPCUBIOA8rqPC + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_SJPCUBIOA8rqPC + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejzDOIBybDpN", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871302, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "FC09F1D5", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:42 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPtKuuB1fWySnf5blcleZ&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejzDOIBybDpN&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_SJPCUBIOA8rqPC","request_duration_ms":502}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:43 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 719ad88e-70b3-4d82-8274-5806dc3437d4 + Original-Request: + - req_ZGRZyXCxIUXC9E + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_ZGRZyXCxIUXC9E + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPuKuuB1fWySn1YuJhvuD", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871302, + "currency": "eur", + "customer": "cus_PyejzDOIBybDpN", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPtKuuB1fWySnf5blcleZ", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:43 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPuKuuB1fWySn1YuJhvuD/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_ZGRZyXCxIUXC9E","request_duration_ms":405}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:44 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - cac78d53-f544-464b-8303-e84ada269640 + Original-Request: + - req_KCA2UUWiEUB4HJ + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_KCA2UUWiEUB4HJ + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPuKuuB1fWySn1YuJhvuD", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871302, + "currency": "eur", + "customer": "cus_PyejzDOIBybDpN", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPuKuuB1fWySn1YV8AUSr", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPtKuuB1fWySnf5blcleZ", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:44 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPuKuuB1fWySn1YuJhvuD + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_KCA2UUWiEUB4HJ","request_duration_ms":1103}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:44 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_Da2a3MRFBmJh64 + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPuKuuB1fWySn1YuJhvuD", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871302, + "currency": "eur", + "customer": "cus_PyejzDOIBybDpN", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPuKuuB1fWySn1YV8AUSr", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPtKuuB1fWySnf5blcleZ", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:44 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPuKuuB1fWySn1YuJhvuD/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_Da2a3MRFBmJh64","request_duration_ms":405}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:46 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - a2b644d6-4fce-4089-a05b-857e4733a67b + Original-Request: + - req_qvfrJW5qxylQHr + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_qvfrJW5qxylQHr + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPuKuuB1fWySn1YuJhvuD", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871302, + "currency": "eur", + "customer": "cus_PyejzDOIBybDpN", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPuKuuB1fWySn1YV8AUSr", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPtKuuB1fWySnf5blcleZ", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:46 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPuKuuB1fWySn1YuJhvuD + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_qvfrJW5qxylQHr","request_duration_ms":1533}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:46 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_SiTlYVqYvz9Aeu + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPuKuuB1fWySn1YuJhvuD", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871302, + "currency": "eur", + "customer": "cus_PyejzDOIBybDpN", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPuKuuB1fWySn1YV8AUSr", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPtKuuB1fWySnf5blcleZ", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:46 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..9ac6da32c50 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=6011111111111117&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_UddWo6oZ6xRVWD","request_duration_ms":1}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:38 GMT + Content-Type: + - application/json + Content-Length: + - '1008' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 7a037dc0-3384-4056-bc3b-7781c6e8114f + Original-Request: + - req_ruQYEyMa7HE0IL + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_ruQYEyMa7HE0IL + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPqKuuB1fWySnJhvcNWbe", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "discover", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "discover", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "SJztPPlfyEUr9hdK", + "funding": "credit", + "generated_from": null, + "last4": "1117", + "networks": { + "available": [ + "discover" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871298, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:39 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_ruQYEyMa7HE0IL","request_duration_ms":547}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:39 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 047ca940-2eb5-4d2f-b864-52b2347968a1 + Original-Request: + - req_RH8SZXNRYFoB3J + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_RH8SZXNRYFoB3J + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejNxKD3I5F0r", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871299, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "E003F017", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:39 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPqKuuB1fWySnJhvcNWbe&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejNxKD3I5F0r&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_RH8SZXNRYFoB3J","request_duration_ms":508}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:39 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 15c862de-bd7f-4165-95fe-0a6ef281ec0c + Original-Request: + - req_2BrH7w6xCebHNe + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_2BrH7w6xCebHNe + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPrKuuB1fWySn1waDmlml", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871299, + "currency": "eur", + "customer": "cus_PyejNxKD3I5F0r", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPqKuuB1fWySnJhvcNWbe", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:39 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPrKuuB1fWySn1waDmlml/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_2BrH7w6xCebHNe","request_duration_ms":395}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:40 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - f54fb634-6d1b-415a-94a5-755e4b51fc40 + Original-Request: + - req_cKclt9jUdynwP8 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_cKclt9jUdynwP8 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPrKuuB1fWySn1waDmlml", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871299, + "currency": "eur", + "customer": "cus_PyejNxKD3I5F0r", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPrKuuB1fWySn1yoLj8wA", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPqKuuB1fWySnJhvcNWbe", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:41 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml new file mode 100644 index 00000000000..e4457b59f77 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=6011981111111113&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_zrfZPH2c8XapeS","request_duration_ms":1091}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:50 GMT + Content-Type: + - application/json + Content-Length: + - '1007' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 732f1c45-4d19-4494-a03b-d9725780b674 + Original-Request: + - req_4TC4ObnZbMHhnk + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_4TC4ObnZbMHhnk + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQ2KuuB1fWySnGpLVYFPe", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "discover", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "discover", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "Y3EGIoTEEuDsD8eJ", + "funding": "debit", + "generated_from": null, + "last4": "1113", + "networks": { + "available": [ + "discover" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871310, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:50 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_4TC4ObnZbMHhnk","request_duration_ms":562}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:51 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - b73a1262-166c-410f-bded-4088c4fd9ffd + Original-Request: + - req_4fHYiy7Ue9KK7M + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_4fHYiy7Ue9KK7M + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejYzVomzn5re", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871310, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "2A75B94A", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:51 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQ2KuuB1fWySnGpLVYFPe&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejYzVomzn5re&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_4fHYiy7Ue9KK7M","request_duration_ms":507}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:51 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 27b3483e-3f44-4ad0-b677-9f9c8aa2c3b4 + Original-Request: + - req_sRjhbgcqN2bsY7 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_sRjhbgcqN2bsY7 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQ3KuuB1fWySn0ZLWpymG", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871311, + "currency": "eur", + "customer": "cus_PyejYzVomzn5re", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ2KuuB1fWySnGpLVYFPe", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:51 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQ3KuuB1fWySn0ZLWpymG/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_sRjhbgcqN2bsY7","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:52 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - f79e14b1-a958-405c-bdd2-1d2fc538f322 + Original-Request: + - req_bvdy3sBZtVigM0 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_bvdy3sBZtVigM0 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQ3KuuB1fWySn0ZLWpymG", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871311, + "currency": "eur", + "customer": "cus_PyejYzVomzn5re", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQ3KuuB1fWySn07iKNKo0", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ2KuuB1fWySnGpLVYFPe", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:52 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQ3KuuB1fWySn0ZLWpymG + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_bvdy3sBZtVigM0","request_duration_ms":1102}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:53 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_M578EkslUXdo3o + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQ3KuuB1fWySn0ZLWpymG", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871311, + "currency": "eur", + "customer": "cus_PyejYzVomzn5re", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQ3KuuB1fWySn07iKNKo0", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ2KuuB1fWySnGpLVYFPe", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:53 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQ3KuuB1fWySn0ZLWpymG/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_M578EkslUXdo3o","request_duration_ms":406}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:54 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 1343fa34-5cfa-408b-9ea3-282d41ada996 + Original-Request: + - req_oEbaBwF6ygxOF7 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_oEbaBwF6ygxOF7 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQ3KuuB1fWySn0ZLWpymG", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871311, + "currency": "eur", + "customer": "cus_PyejYzVomzn5re", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQ3KuuB1fWySn07iKNKo0", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ2KuuB1fWySnGpLVYFPe", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:54 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQ3KuuB1fWySn0ZLWpymG + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_oEbaBwF6ygxOF7","request_duration_ms":1121}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:54 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_p4PeKqmC2GcoAk + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQ3KuuB1fWySn0ZLWpymG", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871311, + "currency": "eur", + "customer": "cus_PyejYzVomzn5re", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQ3KuuB1fWySn07iKNKo0", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQ2KuuB1fWySnGpLVYFPe", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:54 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..e58dedb2e82 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=6011981111111113&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_SiTlYVqYvz9Aeu","request_duration_ms":2}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:47 GMT + Content-Type: + - application/json + Content-Length: + - '1007' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 613f61ce-a28b-4e82-8c1d-043b41bcedf0 + Original-Request: + - req_gjVPNV1bZJCG5V + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_gjVPNV1bZJCG5V + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPzKuuB1fWySnHJcIIcGd", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "discover", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "discover", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "Y3EGIoTEEuDsD8eJ", + "funding": "debit", + "generated_from": null, + "last4": "1113", + "networks": { + "available": [ + "discover" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871307, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:47 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_gjVPNV1bZJCG5V","request_duration_ms":620}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:48 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - dc84e649-01b9-40e1-89ab-bc1d4d9fe428 + Original-Request: + - req_R8EWXoiJRbQ2hS + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_R8EWXoiJRbQ2hS + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejMjytBCz673", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871308, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "370B4AA9", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:48 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPzKuuB1fWySnHJcIIcGd&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejMjytBCz673&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_R8EWXoiJRbQ2hS","request_duration_ms":416}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:48 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 404e8c97-149a-4587-a64a-fe47c10c25e6 + Original-Request: + - req_TEowAnkuxQIfVC + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_TEowAnkuxQIfVC + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQ0KuuB1fWySn19kz36u1", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871308, + "currency": "eur", + "customer": "cus_PyejMjytBCz673", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPzKuuB1fWySnHJcIIcGd", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:48 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQ0KuuB1fWySn19kz36u1/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_TEowAnkuxQIfVC","request_duration_ms":499}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:49 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - fb5b38a3-d7bf-4293-ab59-b5164c94fbdb + Original-Request: + - req_zrfZPH2c8XapeS + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_zrfZPH2c8XapeS + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQ0KuuB1fWySn19kz36u1", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871308, + "currency": "eur", + "customer": "cus_PyejMjytBCz673", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQ0KuuB1fWySn1DqAQGi8", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPzKuuB1fWySnHJcIIcGd", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:49 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/captures_the_payment.yml new file mode 100644 index 00000000000..b541295445c --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=3566002020360505&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_EgbKOKHH1Oogxo","request_duration_ms":1155}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:21 GMT + Content-Type: + - application/json + Content-Length: + - '993' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - f12fedd1-4207-4571-b07a-e2f305836786 + Original-Request: + - req_CQq1ktzUV9MqFJ + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_CQq1ktzUV9MqFJ + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQWKuuB1fWySnWa6V9NVl", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "jcb", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "JP", + "display_brand": "jcb", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "8f2gcynh7EdGyDKt", + "funding": "credit", + "generated_from": null, + "last4": "0505", + "networks": { + "available": [ + "jcb" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871340, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:21 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_CQq1ktzUV9MqFJ","request_duration_ms":422}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:21 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 681d3354-3372-4e19-9427-75af968aca0f + Original-Request: + - req_77OG0zMCusvAH8 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_77OG0zMCusvAH8 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_Pyekag1X6tn12N", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871341, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "5115E0BA", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:21 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQWKuuB1fWySnWa6V9NVl&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyekag1X6tn12N&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_77OG0zMCusvAH8","request_duration_ms":443}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:21 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 9275769b-9c29-4426-aa8e-67e297df398b + Original-Request: + - req_661Y9jf4UsiecR + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_661Y9jf4UsiecR + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQXKuuB1fWySn14y7VDms", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871341, + "currency": "eur", + "customer": "cus_Pyekag1X6tn12N", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQWKuuB1fWySnWa6V9NVl", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:22 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQXKuuB1fWySn14y7VDms/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_661Y9jf4UsiecR","request_duration_ms":468}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:23 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 6eddba57-4009-449d-9648-1528d98c3ca4 + Original-Request: + - req_hnrL0sCstDoCem + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_hnrL0sCstDoCem + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQXKuuB1fWySn14y7VDms", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871341, + "currency": "eur", + "customer": "cus_Pyekag1X6tn12N", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQXKuuB1fWySn16fdv4KQ", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQWKuuB1fWySnWa6V9NVl", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:23 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQXKuuB1fWySn14y7VDms + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_hnrL0sCstDoCem","request_duration_ms":1105}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:23 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_8IXvg6Hp8IuACR + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQXKuuB1fWySn14y7VDms", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871341, + "currency": "eur", + "customer": "cus_Pyekag1X6tn12N", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQXKuuB1fWySn16fdv4KQ", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQWKuuB1fWySnWa6V9NVl", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:23 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQXKuuB1fWySn14y7VDms/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_8IXvg6Hp8IuACR","request_duration_ms":370}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:24 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - '0708c16d-f364-4275-b7e8-fc09198ff28d' + Original-Request: + - req_Eq04Pk3EG52RWi + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_Eq04Pk3EG52RWi + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQXKuuB1fWySn14y7VDms", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871341, + "currency": "eur", + "customer": "cus_Pyekag1X6tn12N", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQXKuuB1fWySn16fdv4KQ", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQWKuuB1fWySnWa6V9NVl", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:24 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQXKuuB1fWySn14y7VDms + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_Eq04Pk3EG52RWi","request_duration_ms":1058}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:24 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_Afjysw1r194ODw + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQXKuuB1fWySn14y7VDms", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871341, + "currency": "eur", + "customer": "cus_Pyekag1X6tn12N", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQXKuuB1fWySn16fdv4KQ", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQWKuuB1fWySnWa6V9NVl", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:25 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..eee8222ad89 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=3566002020360505&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_3Dn9T1aixPSePK","request_duration_ms":304}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:18 GMT + Content-Type: + - application/json + Content-Length: + - '993' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 7742efc8-7b8c-4689-898e-35826e494d32 + Original-Request: + - req_mPAsulWY5R9k9c + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_mPAsulWY5R9k9c + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQTKuuB1fWySn86A5AaSf", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "jcb", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "JP", + "display_brand": "jcb", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "8f2gcynh7EdGyDKt", + "funding": "credit", + "generated_from": null, + "last4": "0505", + "networks": { + "available": [ + "jcb" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871338, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:18 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_mPAsulWY5R9k9c","request_duration_ms":479}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:18 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 778f601d-a294-4d1c-bc4d-f8fb2d95e33f + Original-Request: + - req_dKbd53ZWnSnmFA + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_dKbd53ZWnSnmFA + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejkLXRIq1ugx", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871338, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "8A1F63A5", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:18 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQTKuuB1fWySn86A5AaSf&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejkLXRIq1ugx&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_dKbd53ZWnSnmFA","request_duration_ms":474}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:19 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - eb4df177-5e40-4ccf-a6f1-8624979cbdcb + Original-Request: + - req_PaAwwxnxPniScH + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_PaAwwxnxPniScH + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQUKuuB1fWySn27Ds09zw", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871338, + "currency": "eur", + "customer": "cus_PyejkLXRIq1ugx", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQTKuuB1fWySn86A5AaSf", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:19 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQUKuuB1fWySn27Ds09zw/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_PaAwwxnxPniScH","request_duration_ms":426}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:20 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 24abb05e-86bc-4a71-80c8-747482832ab1 + Original-Request: + - req_EgbKOKHH1Oogxo + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_EgbKOKHH1Oogxo + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQUKuuB1fWySn27Ds09zw", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871338, + "currency": "eur", + "customer": "cus_PyejkLXRIq1ugx", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQUKuuB1fWySn2Tnqlb70", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQTKuuB1fWySn86A5AaSf", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:20 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/captures_the_payment.yml new file mode 100644 index 00000000000..6e98d0dd3f4 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=5555555555554444&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_dpZudD7c3yo3SI","request_duration_ms":1200}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:03 GMT + Content-Type: + - application/json + Content-Length: + - '1014' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 3d7aec29-77cb-4e54-9b5f-4dd4c40180e4 + Original-Request: + - req_KOzFI7nt7kMKke + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_KOzFI7nt7kMKke + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPHKuuB1fWySnLbjJpRi0", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "mastercard", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "mastercard", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "BL35fEFVcTTS5wpE", + "funding": "credit", + "generated_from": null, + "last4": "4444", + "networks": { + "available": [ + "mastercard" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871263, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:03 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_KOzFI7nt7kMKke","request_duration_ms":455}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:03 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - e7d67003-d410-4c36-8ce9-155a7992119b + Original-Request: + - req_PSvwe3Dxuav0Gf + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_PSvwe3Dxuav0Gf + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyeiYi8vVBRK2u", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871263, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "CFD0CF05", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:03 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPHKuuB1fWySnLbjJpRi0&payment_method_types[0]=card&capture_method=manual&customer=cus_PyeiYi8vVBRK2u&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_PSvwe3Dxuav0Gf","request_duration_ms":501}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:04 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 26500e8b-bb32-4172-a28e-5eda772e8932 + Original-Request: + - req_a3VHqjs5pn2kcv + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_a3VHqjs5pn2kcv + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPIKuuB1fWySn2GVyivsK", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871264, + "currency": "eur", + "customer": "cus_PyeiYi8vVBRK2u", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPHKuuB1fWySnLbjJpRi0", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:04 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPIKuuB1fWySn2GVyivsK/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_a3VHqjs5pn2kcv","request_duration_ms":510}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:05 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 2165ddb3-503e-448f-917e-b234ad764383 + Original-Request: + - req_vZt5nK8DPgR8pL + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_vZt5nK8DPgR8pL + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPIKuuB1fWySn2GVyivsK", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871264, + "currency": "eur", + "customer": "cus_PyeiYi8vVBRK2u", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPIKuuB1fWySn2MQDbPgq", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPHKuuB1fWySnLbjJpRi0", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:05 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPIKuuB1fWySn2GVyivsK + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_vZt5nK8DPgR8pL","request_duration_ms":1201}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:05 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_zs1gxsav59C70k + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPIKuuB1fWySn2GVyivsK", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871264, + "currency": "eur", + "customer": "cus_PyeiYi8vVBRK2u", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPIKuuB1fWySn2MQDbPgq", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPHKuuB1fWySnLbjJpRi0", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:06 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPIKuuB1fWySn2GVyivsK/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_zs1gxsav59C70k","request_duration_ms":405}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:07 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 69dcfd08-8568-46e4-ac73-73461c8d3ea5 + Original-Request: + - req_3N7vO6ii3OWarj + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_3N7vO6ii3OWarj + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPIKuuB1fWySn2GVyivsK", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871264, + "currency": "eur", + "customer": "cus_PyeiYi8vVBRK2u", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPIKuuB1fWySn2MQDbPgq", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPHKuuB1fWySnLbjJpRi0", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:07 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPIKuuB1fWySn2GVyivsK + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_3N7vO6ii3OWarj","request_duration_ms":1417}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:07 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_OVEg8EKA2rq1lg + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPIKuuB1fWySn2GVyivsK", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871264, + "currency": "eur", + "customer": "cus_PyeiYi8vVBRK2u", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPIKuuB1fWySn2MQDbPgq", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPHKuuB1fWySnLbjJpRi0", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:07 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..4eb1655ea1f --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=5555555555554444&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_0WphKlQD6xRFlt","request_duration_ms":345}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:00 GMT + Content-Type: + - application/json + Content-Length: + - '1014' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - f531daeb-de9d-45ec-a020-192f5232114b + Original-Request: + - req_p5BJZnd5OEEQIp + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_p5BJZnd5OEEQIp + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPDKuuB1fWySnu51i92IF", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "mastercard", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "mastercard", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "BL35fEFVcTTS5wpE", + "funding": "credit", + "generated_from": null, + "last4": "4444", + "networks": { + "available": [ + "mastercard" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871260, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:00 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_p5BJZnd5OEEQIp","request_duration_ms":481}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:00 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 9fa23470-94c1-4922-bbb1-147103e5ea58 + Original-Request: + - req_Kc3uIqCbKbK4aj + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_Kc3uIqCbKbK4aj + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyeiL4Ha7nH52p", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871260, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "D7D6FFF2", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:00 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPDKuuB1fWySnu51i92IF&payment_method_types[0]=card&capture_method=manual&customer=cus_PyeiL4Ha7nH52p&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_Kc3uIqCbKbK4aj","request_duration_ms":405}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:01 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 654ac650-6465-45b4-9e09-ff05016c7dd7 + Original-Request: + - req_ehiape7Y2BCHMQ + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_ehiape7Y2BCHMQ + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPEKuuB1fWySn2ixEyxTG", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871260, + "currency": "eur", + "customer": "cus_PyeiL4Ha7nH52p", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPDKuuB1fWySnu51i92IF", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:01 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPEKuuB1fWySn2ixEyxTG/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_ehiape7Y2BCHMQ","request_duration_ms":510}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:02 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 900491a2-de27-4c97-aa24-9fca5a0bb5d7 + Original-Request: + - req_dpZudD7c3yo3SI + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_dpZudD7c3yo3SI + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPEKuuB1fWySn2ixEyxTG", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871260, + "currency": "eur", + "customer": "cus_PyeiL4Ha7nH52p", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPEKuuB1fWySn2gDu5Twh", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPDKuuB1fWySnu51i92IF", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:02 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/captures_the_payment.yml new file mode 100644 index 00000000000..758b1a483f1 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=2223003122003222&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_Qwct4ea8onfN4E","request_duration_ms":1148}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:11 GMT + Content-Type: + - application/json + Content-Length: + - '1014' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 39a3fedf-0082-4b70-8fc9-64e5b90109e7 + Original-Request: + - req_ohuQ0ZgkxTZ7IU + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_ohuQ0ZgkxTZ7IU + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPPKuuB1fWySnAFYipXE7", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "mastercard", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "mastercard", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "0gTPwvyIV7E6CAld", + "funding": "credit", + "generated_from": null, + "last4": "3222", + "networks": { + "available": [ + "mastercard" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871271, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:11 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_ohuQ0ZgkxTZ7IU","request_duration_ms":441}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:11 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - ef0764eb-2778-42e9-9823-11a47929eeb5 + Original-Request: + - req_UMrYXi7ohBePV0 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_UMrYXi7ohBePV0 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyeiXH2m671SXL", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871271, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "A66473CE", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:11 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPPKuuB1fWySnAFYipXE7&payment_method_types[0]=card&capture_method=manual&customer=cus_PyeiXH2m671SXL&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_UMrYXi7ohBePV0","request_duration_ms":501}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:12 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 2dfad88b-9de8-45bf-8137-dc591deccce3 + Original-Request: + - req_8IFMzUqkWeaFle + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_8IFMzUqkWeaFle + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPPKuuB1fWySn0bvuskRz", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871271, + "currency": "eur", + "customer": "cus_PyeiXH2m671SXL", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPPKuuB1fWySnAFYipXE7", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:12 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPPKuuB1fWySn0bvuskRz/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_8IFMzUqkWeaFle","request_duration_ms":405}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:13 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 0df5fd10-aff7-4fad-9aec-df211d63fe3c + Original-Request: + - req_mPlX6F3DUm1kTj + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_mPlX6F3DUm1kTj + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPPKuuB1fWySn0bvuskRz", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871271, + "currency": "eur", + "customer": "cus_PyeiXH2m671SXL", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPPKuuB1fWySn0d4HHeI5", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPPKuuB1fWySnAFYipXE7", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:13 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPPKuuB1fWySn0bvuskRz + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_mPlX6F3DUm1kTj","request_duration_ms":1101}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:13 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_M0dyEDatIOFBZF + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPPKuuB1fWySn0bvuskRz", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871271, + "currency": "eur", + "customer": "cus_PyeiXH2m671SXL", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPPKuuB1fWySn0d4HHeI5", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPPKuuB1fWySnAFYipXE7", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:13 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPPKuuB1fWySn0bvuskRz/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_M0dyEDatIOFBZF","request_duration_ms":406}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:14 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 4ded4141-cfe2-420a-906a-9e1a630eee56 + Original-Request: + - req_u1DEUioMcDKSBz + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_u1DEUioMcDKSBz + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPPKuuB1fWySn0bvuskRz", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871271, + "currency": "eur", + "customer": "cus_PyeiXH2m671SXL", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPPKuuB1fWySn0d4HHeI5", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPPKuuB1fWySnAFYipXE7", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:14 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPPKuuB1fWySn0bvuskRz + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_u1DEUioMcDKSBz","request_duration_ms":1123}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:15 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_bPSNztR1dTneVk + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPPKuuB1fWySn0bvuskRz", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871271, + "currency": "eur", + "customer": "cus_PyeiXH2m671SXL", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPPKuuB1fWySn0d4HHeI5", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPPKuuB1fWySnAFYipXE7", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:15 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..36c742b099a --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=2223003122003222&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_OVEg8EKA2rq1lg","request_duration_ms":418}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:08 GMT + Content-Type: + - application/json + Content-Length: + - '1014' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 1cd7bf09-dd39-41dd-b997-08774ce3c46c + Original-Request: + - req_SI9IQrjUBSenxj + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_SI9IQrjUBSenxj + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPMKuuB1fWySnuy58VLut", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "mastercard", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "mastercard", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "0gTPwvyIV7E6CAld", + "funding": "credit", + "generated_from": null, + "last4": "3222", + "networks": { + "available": [ + "mastercard" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871268, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:08 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_SI9IQrjUBSenxj","request_duration_ms":456}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:08 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 794febe3-f216-4eba-b499-7441f598cf39 + Original-Request: + - req_2wNbvHpVH4bRr8 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_2wNbvHpVH4bRr8 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_Pyei3qbC4ngA0q", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871268, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "6411439E", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:08 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPMKuuB1fWySnuy58VLut&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyei3qbC4ngA0q&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_2wNbvHpVH4bRr8","request_duration_ms":430}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:09 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 99ab2935-1385-434a-ae8f-b849104cde13 + Original-Request: + - req_9bq5isB4pDLUnQ + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_9bq5isB4pDLUnQ + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPNKuuB1fWySn0iOA6eso", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871269, + "currency": "eur", + "customer": "cus_Pyei3qbC4ngA0q", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPMKuuB1fWySnuy58VLut", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:09 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPNKuuB1fWySn0iOA6eso/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_9bq5isB4pDLUnQ","request_duration_ms":394}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:10 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 294702a4-00ae-4ba1-bb7d-70bd9a1891d9 + Original-Request: + - req_Qwct4ea8onfN4E + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_Qwct4ea8onfN4E + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPNKuuB1fWySn0iOA6eso", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871269, + "currency": "eur", + "customer": "cus_Pyei3qbC4ngA0q", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPNKuuB1fWySn0E1kZCXk", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPMKuuB1fWySnuy58VLut", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:10 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/captures_the_payment.yml new file mode 100644 index 00000000000..43ad09b3505 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=5200828282828210&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_8cc5GPIq99TZOD","request_duration_ms":995}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:18 GMT + Content-Type: + - application/json + Content-Length: + - '1013' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - d57a22e1-0a9d-4063-83a8-d40d90439a03 + Original-Request: + - req_oWDqQNDLNaLxs2 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_oWDqQNDLNaLxs2 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPWKuuB1fWySnEN1H2XcM", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "mastercard", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "mastercard", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "DpQ8VoC0Z3P9xrbi", + "funding": "debit", + "generated_from": null, + "last4": "8210", + "networks": { + "available": [ + "mastercard" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871278, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:18 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_oWDqQNDLNaLxs2","request_duration_ms":423}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:19 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 1870f353-dce7-4dae-a21e-d8371f612aec + Original-Request: + - req_VuC610HZ6EQ48S + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_VuC610HZ6EQ48S + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyeiWqm0iyYG50", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871279, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "61598C19", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:19 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPWKuuB1fWySnEN1H2XcM&payment_method_types[0]=card&capture_method=manual&customer=cus_PyeiWqm0iyYG50&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_VuC610HZ6EQ48S","request_duration_ms":429}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:19 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 90c34d1b-d4c3-4dc7-830d-7d0fa7165c76 + Original-Request: + - req_89FBzQnKpNe68K + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_89FBzQnKpNe68K + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPXKuuB1fWySn2dp19af5", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871279, + "currency": "eur", + "customer": "cus_PyeiWqm0iyYG50", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPWKuuB1fWySnEN1H2XcM", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:19 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPXKuuB1fWySn2dp19af5/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_89FBzQnKpNe68K","request_duration_ms":419}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:20 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 3eccb79a-3dc8-4d23-999b-54122e5f775b + Original-Request: + - req_Xlbq59TKfnepfo + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_Xlbq59TKfnepfo + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPXKuuB1fWySn2dp19af5", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871279, + "currency": "eur", + "customer": "cus_PyeiWqm0iyYG50", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPXKuuB1fWySn2ueI0CxW", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPWKuuB1fWySnEN1H2XcM", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:21 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPXKuuB1fWySn2dp19af5 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_Xlbq59TKfnepfo","request_duration_ms":1180}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:21 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_HK7DlLFepfzHTF + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPXKuuB1fWySn2dp19af5", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871279, + "currency": "eur", + "customer": "cus_PyeiWqm0iyYG50", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPXKuuB1fWySn2ueI0CxW", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPWKuuB1fWySnEN1H2XcM", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:21 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPXKuuB1fWySn2dp19af5/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_HK7DlLFepfzHTF","request_duration_ms":404}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:22 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - e241a01c-9037-4c29-bf7a-18cd817a4860 + Original-Request: + - req_l5OOJhOazt6PXP + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_l5OOJhOazt6PXP + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPXKuuB1fWySn2dp19af5", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871279, + "currency": "eur", + "customer": "cus_PyeiWqm0iyYG50", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPXKuuB1fWySn2ueI0CxW", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPWKuuB1fWySnEN1H2XcM", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:22 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPXKuuB1fWySn2dp19af5 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_l5OOJhOazt6PXP","request_duration_ms":1327}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:23 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_B0SeZ79RLy2ebO + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPXKuuB1fWySn2dp19af5", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871279, + "currency": "eur", + "customer": "cus_PyeiWqm0iyYG50", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPXKuuB1fWySn2ueI0CxW", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPWKuuB1fWySnEN1H2XcM", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:23 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..4ebd8fe0243 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=5200828282828210&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_bPSNztR1dTneVk","request_duration_ms":392}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:15 GMT + Content-Type: + - application/json + Content-Length: + - '1013' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - be62fead-d724-4e7f-8f55-4ef918754c29 + Original-Request: + - req_bpLMSxtmzD1zMl + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_bpLMSxtmzD1zMl + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPTKuuB1fWySnoz4GaqoV", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "mastercard", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "mastercard", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "DpQ8VoC0Z3P9xrbi", + "funding": "debit", + "generated_from": null, + "last4": "8210", + "networks": { + "available": [ + "mastercard" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871275, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:15 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_bpLMSxtmzD1zMl","request_duration_ms":523}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:16 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 649ebdb6-ef29-4cbb-bc9e-98c21ae93685 + Original-Request: + - req_X2zcbnOjKFGYld + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_X2zcbnOjKFGYld + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_Pyei5krltxQE6d", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871276, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "91D990B8", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:16 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPTKuuB1fWySnoz4GaqoV&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyei5krltxQE6d&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_X2zcbnOjKFGYld","request_duration_ms":507}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:16 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 8fce28bf-6c72-4372-b021-fa9d6d8bf502 + Original-Request: + - req_kDyx3XmV2eI4QT + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_kDyx3XmV2eI4QT + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPUKuuB1fWySn0j2B8Quf", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871276, + "currency": "eur", + "customer": "cus_Pyei5krltxQE6d", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPTKuuB1fWySnoz4GaqoV", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:16 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPUKuuB1fWySn0j2B8Quf/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_kDyx3XmV2eI4QT","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:17 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 71740a65-f9b3-4dac-a364-5dc079a153db + Original-Request: + - req_8cc5GPIq99TZOD + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_8cc5GPIq99TZOD + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPUKuuB1fWySn0j2B8Quf", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871276, + "currency": "eur", + "customer": "cus_Pyei5krltxQE6d", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPUKuuB1fWySn0qUOZgP2", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPTKuuB1fWySnoz4GaqoV", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:17 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/captures_the_payment.yml new file mode 100644 index 00000000000..b47c8718cac --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=5105105105105100&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_rL3sIDabBbB4Gh","request_duration_ms":1207}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:26 GMT + Content-Type: + - application/json + Content-Length: + - '1015' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 8e6f6958-d1b5-48bc-926f-4059825fedac + Original-Request: + - req_n0rtzuqR4K7abm + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_n0rtzuqR4K7abm + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPeKuuB1fWySnW4VKALy7", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "mastercard", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "mastercard", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "B9ykFJ6imaeWU8aO", + "funding": "prepaid", + "generated_from": null, + "last4": "5100", + "networks": { + "available": [ + "mastercard" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871286, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:26 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_n0rtzuqR4K7abm","request_duration_ms":500}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:27 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - b0144ff2-71c9-419b-b436-b0e7a8209776 + Original-Request: + - req_iNcB4TD0OoXrMp + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_iNcB4TD0OoXrMp + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_Pyejn2MRlZ3Rv4", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871286, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "BEEAD97C", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:27 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPeKuuB1fWySnW4VKALy7&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyejn2MRlZ3Rv4&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_iNcB4TD0OoXrMp","request_duration_ms":421}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:27 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - cbfb6a51-0d39-47f5-8f00-49d09f946663 + Original-Request: + - req_XZ0IF5IsTNRkzQ + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_XZ0IF5IsTNRkzQ + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPfKuuB1fWySn1bQa89IW", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871287, + "currency": "eur", + "customer": "cus_Pyejn2MRlZ3Rv4", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPeKuuB1fWySnW4VKALy7", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:27 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPfKuuB1fWySn1bQa89IW/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_XZ0IF5IsTNRkzQ","request_duration_ms":496}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:28 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 2054d3c9-9176-44e6-8818-9e95b038b20e + Original-Request: + - req_YrjEkAC0zwuoxD + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_YrjEkAC0zwuoxD + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPfKuuB1fWySn1bQa89IW", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871287, + "currency": "eur", + "customer": "cus_Pyejn2MRlZ3Rv4", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPfKuuB1fWySn1Y0eeYT1", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPeKuuB1fWySnW4VKALy7", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:28 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPfKuuB1fWySn1bQa89IW + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_YrjEkAC0zwuoxD","request_duration_ms":1103}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:28 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_HYmPlTpnYcTd5G + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPfKuuB1fWySn1bQa89IW", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871287, + "currency": "eur", + "customer": "cus_Pyejn2MRlZ3Rv4", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPfKuuB1fWySn1Y0eeYT1", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPeKuuB1fWySnW4VKALy7", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:29 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPfKuuB1fWySn1bQa89IW/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_HYmPlTpnYcTd5G","request_duration_ms":304}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:30 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - '084b8ea3-813c-42b7-a703-017a4962dee1' + Original-Request: + - req_FfAz3RRnSapSHv + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_FfAz3RRnSapSHv + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPfKuuB1fWySn1bQa89IW", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871287, + "currency": "eur", + "customer": "cus_Pyejn2MRlZ3Rv4", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPfKuuB1fWySn1Y0eeYT1", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPeKuuB1fWySnW4VKALy7", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:30 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPfKuuB1fWySn1bQa89IW + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_FfAz3RRnSapSHv","request_duration_ms":1442}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:30 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_ZmshM8deU5LJ8a + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPfKuuB1fWySn1bQa89IW", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871287, + "currency": "eur", + "customer": "cus_Pyejn2MRlZ3Rv4", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPfKuuB1fWySn1Y0eeYT1", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPeKuuB1fWySnW4VKALy7", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:30 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..0e0e28c6766 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=5105105105105100&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_B0SeZ79RLy2ebO","request_duration_ms":407}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:23 GMT + Content-Type: + - application/json + Content-Length: + - '1015' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 06bc2d0e-bc55-4050-b6c8-2b30725ec08f + Original-Request: + - req_MBZLIMix75hQDk + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_MBZLIMix75hQDk + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hPbKuuB1fWySn1PuTLuFG", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "mastercard", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "mastercard", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "B9ykFJ6imaeWU8aO", + "funding": "prepaid", + "generated_from": null, + "last4": "5100", + "networks": { + "available": [ + "mastercard" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871283, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:21:23 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_MBZLIMix75hQDk","request_duration_ms":382}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:24 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 021f9338-d514-4116-8e74-72165bbcdd79 + Original-Request: + - req_HAqVYXRrNZNl5H + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_HAqVYXRrNZNl5H + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyejowstccnzWm", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871283, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "3615CA5B", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:21:24 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hPbKuuB1fWySn1PuTLuFG&payment_method_types[0]=card&capture_method=manual&customer=cus_PyejowstccnzWm&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_HAqVYXRrNZNl5H","request_duration_ms":414}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:24 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - c946b378-ce4c-4e88-a0ac-79bf916c71f3 + Original-Request: + - req_uyYhqCO1cHsTvf + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_uyYhqCO1cHsTvf + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPcKuuB1fWySn1BtL6gPB", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871284, + "currency": "eur", + "customer": "cus_PyejowstccnzWm", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPbKuuB1fWySn1PuTLuFG", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:24 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hPcKuuB1fWySn1BtL6gPB/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_uyYhqCO1cHsTvf","request_duration_ms":451}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:21:25 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 6a6ff1ca-5b17-4cdf-a36e-1bf792e14c1e + Original-Request: + - req_rL3sIDabBbB4Gh + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_rL3sIDabBbB4Gh + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hPcKuuB1fWySn1BtL6gPB", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871284, + "currency": "eur", + "customer": "cus_PyejowstccnzWm", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hPcKuuB1fWySn1aE0ioJv", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hPbKuuB1fWySn1PuTLuFG", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:21:25 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/captures_the_payment.yml new file mode 100644 index 00000000000..e68a91bd183 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=6200000000000005&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_fyjHcxLOF999oK","request_duration_ms":1002}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:28 GMT + Content-Type: + - application/json + Content-Length: + - '1009' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 2eb27a6a-babd-4b11-a100-1cdc2bd22a54 + Original-Request: + - req_txAjwfJDd9kadL + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_txAjwfJDd9kadL + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQeKuuB1fWySnUs50egBB", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "unionpay", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "CN", + "display_brand": "union_pay", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "Aq45rzUxvT6SiF1W", + "funding": "credit", + "generated_from": null, + "last4": "0005", + "networks": { + "available": [ + "unionpay" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871348, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:28 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_txAjwfJDd9kadL","request_duration_ms":510}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:28 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 4b483425-01c2-4ec8-889f-39731de009b1 + Original-Request: + - req_w1xt4D4fDnHl0q + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_w1xt4D4fDnHl0q + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyekeI9L8KiWy2", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871348, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "5AB93277", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:29 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQeKuuB1fWySnUs50egBB&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekeI9L8KiWy2&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_w1xt4D4fDnHl0q","request_duration_ms":508}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:29 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 2fdc45da-4ecd-4470-b775-92c1cdc7da5f + Original-Request: + - req_LudIVtt9zALBx6 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_LudIVtt9zALBx6 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQfKuuB1fWySn0Ntn0Tc9", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871349, + "currency": "eur", + "customer": "cus_PyekeI9L8KiWy2", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQeKuuB1fWySnUs50egBB", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:29 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQfKuuB1fWySn0Ntn0Tc9/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_LudIVtt9zALBx6","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:30 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 57c1ea23-9756-4500-a486-310f5029c61e + Original-Request: + - req_e402naQIpk5iiQ + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_e402naQIpk5iiQ + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQfKuuB1fWySn0Ntn0Tc9", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871349, + "currency": "eur", + "customer": "cus_PyekeI9L8KiWy2", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQfKuuB1fWySn0dMYJQcG", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQeKuuB1fWySnUs50egBB", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:30 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQfKuuB1fWySn0Ntn0Tc9 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_e402naQIpk5iiQ","request_duration_ms":1145}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:31 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_GUTEmc3cfgDcU1 + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQfKuuB1fWySn0Ntn0Tc9", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871349, + "currency": "eur", + "customer": "cus_PyekeI9L8KiWy2", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQfKuuB1fWySn0dMYJQcG", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQeKuuB1fWySnUs50egBB", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:31 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQfKuuB1fWySn0Ntn0Tc9/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_GUTEmc3cfgDcU1","request_duration_ms":312}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:32 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 0c0e55af-232b-4f6b-a4bc-a4d88df86c93 + Original-Request: + - req_EpQaQdb5BARrIA + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_EpQaQdb5BARrIA + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQfKuuB1fWySn0Ntn0Tc9", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871349, + "currency": "eur", + "customer": "cus_PyekeI9L8KiWy2", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQfKuuB1fWySn0dMYJQcG", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQeKuuB1fWySnUs50egBB", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:32 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQfKuuB1fWySn0Ntn0Tc9 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_EpQaQdb5BARrIA","request_duration_ms":1588}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:32 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_RWM4G5bHZtHy17 + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQfKuuB1fWySn0Ntn0Tc9", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871349, + "currency": "eur", + "customer": "cus_PyekeI9L8KiWy2", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQfKuuB1fWySn0dMYJQcG", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQeKuuB1fWySnUs50egBB", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:33 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..83158e32cf1 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=6200000000000005&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_Afjysw1r194ODw","request_duration_ms":407}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:25 GMT + Content-Type: + - application/json + Content-Length: + - '1009' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - a6435b66-6e13-4bf7-a2e9-a4bd93fb7710 + Original-Request: + - req_X05gS7DaBUKLKx + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_X05gS7DaBUKLKx + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQbKuuB1fWySnhVjKsc0C", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "unionpay", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "CN", + "display_brand": "union_pay", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "Aq45rzUxvT6SiF1W", + "funding": "credit", + "generated_from": null, + "last4": "0005", + "networks": { + "available": [ + "unionpay" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871345, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:25 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_X05gS7DaBUKLKx","request_duration_ms":647}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:26 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 0acd3d5e-8df0-4e67-97b1-7d28428bc041 + Original-Request: + - req_9OhC77tXpXQnb2 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_9OhC77tXpXQnb2 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyekqfjxClE8lB", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871345, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "EFA75C2E", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:26 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQbKuuB1fWySnhVjKsc0C&payment_method_types[0]=card&capture_method=manual&customer=cus_PyekqfjxClE8lB&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_9OhC77tXpXQnb2","request_duration_ms":407}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:26 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 8744c2fa-37a5-4a5b-9468-6fa09f102ac0 + Original-Request: + - req_3X99KLCSYLRjSH + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_3X99KLCSYLRjSH + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQcKuuB1fWySn1G1NpJx9", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871346, + "currency": "eur", + "customer": "cus_PyekqfjxClE8lB", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQbKuuB1fWySnhVjKsc0C", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:26 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQcKuuB1fWySn1G1NpJx9/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_3X99KLCSYLRjSH","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:27 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 5b830090-f7bb-455d-ac57-64054198be13 + Original-Request: + - req_fyjHcxLOF999oK + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_fyjHcxLOF999oK + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQcKuuB1fWySn1G1NpJx9", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871346, + "currency": "eur", + "customer": "cus_PyekqfjxClE8lB", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQcKuuB1fWySn1Emwtq0O", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQbKuuB1fWySnhVjKsc0C", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:27 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/captures_the_payment.yml new file mode 100644 index 00000000000..05a87ba93c7 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=6205500000000000004&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_sqvzkQBIKE8xCY","request_duration_ms":998}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:36 GMT + Content-Type: + - application/json + Content-Length: + - '1008' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 8603cfdb-1941-4710-bbc9-29882b72dcbe + Original-Request: + - req_ccHOb4oeDkQl3S + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_ccHOb4oeDkQl3S + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQmKuuB1fWySnn2orDvvg", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "unionpay", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "union_pay", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "F9o1vzLUnyEJBPXi", + "funding": "debit", + "generated_from": null, + "last4": "0004", + "networks": { + "available": [ + "unionpay" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871356, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:36 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_ccHOb4oeDkQl3S","request_duration_ms":508}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:37 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - e9e3b4b3-bdf0-42c7-9a54-ea8e87b13699 + Original-Request: + - req_zZ0i2t3dCI6mVx + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_zZ0i2t3dCI6mVx + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_Pyek3c9niYy4Vu", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871356, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "8A52686D", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:37 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQmKuuB1fWySnn2orDvvg&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyek3c9niYy4Vu&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_zZ0i2t3dCI6mVx","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:37 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 492b91ee-5cc9-4f81-9be2-c0553b9941d7 + Original-Request: + - req_KE1rWeddaL5Mm6 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_KE1rWeddaL5Mm6 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQnKuuB1fWySn0DgdsMmY", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871357, + "currency": "eur", + "customer": "cus_Pyek3c9niYy4Vu", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQmKuuB1fWySnn2orDvvg", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:37 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQnKuuB1fWySn0DgdsMmY/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_KE1rWeddaL5Mm6","request_duration_ms":407}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:38 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 98fec250-8a2b-486b-942f-b48fa9900659 + Original-Request: + - req_yk8nJfBvtarnL2 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_yk8nJfBvtarnL2 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQnKuuB1fWySn0DgdsMmY", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871357, + "currency": "eur", + "customer": "cus_Pyek3c9niYy4Vu", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQnKuuB1fWySn0t9JlVPu", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQmKuuB1fWySnn2orDvvg", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:38 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQnKuuB1fWySn0DgdsMmY + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_yk8nJfBvtarnL2","request_duration_ms":1052}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:38 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_qgIZfThnNGQCzC + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQnKuuB1fWySn0DgdsMmY", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871357, + "currency": "eur", + "customer": "cus_Pyek3c9niYy4Vu", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQnKuuB1fWySn0t9JlVPu", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQmKuuB1fWySnn2orDvvg", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:38 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQnKuuB1fWySn0DgdsMmY/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_qgIZfThnNGQCzC","request_duration_ms":354}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:40 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - dbbb8330-3a06-4c0c-a7d1-15513e71c503 + Original-Request: + - req_O51iX4HWFWM4Np + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_O51iX4HWFWM4Np + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQnKuuB1fWySn0DgdsMmY", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871357, + "currency": "eur", + "customer": "cus_Pyek3c9niYy4Vu", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQnKuuB1fWySn0t9JlVPu", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQmKuuB1fWySnn2orDvvg", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:40 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQnKuuB1fWySn0DgdsMmY + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_O51iX4HWFWM4Np","request_duration_ms":1431}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:40 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_jw6WIU0GBeVnT2 + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQnKuuB1fWySn0DgdsMmY", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871357, + "currency": "eur", + "customer": "cus_Pyek3c9niYy4Vu", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQnKuuB1fWySn0t9JlVPu", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQmKuuB1fWySnn2orDvvg", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:40 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..f9d88a0aef4 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=6205500000000000004&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_RWM4G5bHZtHy17","request_duration_ms":408}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:33 GMT + Content-Type: + - application/json + Content-Length: + - '1008' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 98ae47f6-108a-483d-8bd4-5f3d04e19134 + Original-Request: + - req_rUeElhqjldp8wd + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_rUeElhqjldp8wd + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hQjKuuB1fWySnujPywnNy", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "unionpay", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "union_pay", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "F9o1vzLUnyEJBPXi", + "funding": "debit", + "generated_from": null, + "last4": "0004", + "networks": { + "available": [ + "unionpay" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871353, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:22:33 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_rUeElhqjldp8wd","request_duration_ms":528}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:34 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - b0c56f1b-7bba-44c1-9207-cb06cc604b82 + Original-Request: + - req_CbpEHLUsshTrfU + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_CbpEHLUsshTrfU + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_Pyek5nTJeHfC9P", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871353, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "6108543E", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:22:34 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hQjKuuB1fWySnujPywnNy&payment_method_types[0]=card&capture_method=manual&customer=cus_Pyek5nTJeHfC9P&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_CbpEHLUsshTrfU","request_duration_ms":509}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:34 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 7ecb4a7c-5bf1-425f-8eac-0dfb3df8ce31 + Original-Request: + - req_Eytj6WHXIq3CWW + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_Eytj6WHXIq3CWW + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQkKuuB1fWySn1brfFX0e", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871354, + "currency": "eur", + "customer": "cus_Pyek5nTJeHfC9P", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQjKuuB1fWySnujPywnNy", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:34 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hQkKuuB1fWySn1brfFX0e/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_Eytj6WHXIq3CWW","request_duration_ms":407}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:22:35 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - d1232c7c-ee0d-4e45-804f-d5703cbe17ba + Original-Request: + - req_sqvzkQBIKE8xCY + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_sqvzkQBIKE8xCY + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hQkKuuB1fWySn1brfFX0e", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871354, + "currency": "eur", + "customer": "cus_Pyek5nTJeHfC9P", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hQkKuuB1fWySn1PKudh8f", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hQjKuuB1fWySnujPywnNy", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:22:35 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/captures_the_payment.yml new file mode 100644 index 00000000000..1364f3a8d9c --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4242424242424242&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_UgmaT5BH5c9gjk","request_duration_ms":1042}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:47 GMT + Content-Type: + - application/json + Content-Length: + - '996' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 837ec842-588f-411a-bccc-705efde724e7 + Original-Request: + - req_xrMxRLbJUU4A7G + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_xrMxRLbJUU4A7G + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hP1KuuB1fWySnz03Vo2yF", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "6E6tgVjx6U65iHFV", + "funding": "credit", + "generated_from": null, + "last4": "4242", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871247, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:20:48 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_xrMxRLbJUU4A7G","request_duration_ms":458}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:48 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 1ceb128f-c6f0-4014-91ea-7618ef44b664 + Original-Request: + - req_MaiP5LaujwU0LK + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_MaiP5LaujwU0LK + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyeiUZlYixpFpZ", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871248, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "A6709702", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:20:48 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hP1KuuB1fWySnz03Vo2yF&payment_method_types[0]=card&capture_method=manual&customer=cus_PyeiUZlYixpFpZ&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_MaiP5LaujwU0LK","request_duration_ms":451}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:48 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 7b03c948-3308-4ee3-99c0-e74455818509 + Original-Request: + - req_UzsmC4fTGeJTcv + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_UzsmC4fTGeJTcv + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP2KuuB1fWySn0XKEWUXu", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871248, + "currency": "eur", + "customer": "cus_PyeiUZlYixpFpZ", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP1KuuB1fWySnz03Vo2yF", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:48 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hP2KuuB1fWySn0XKEWUXu/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_UzsmC4fTGeJTcv","request_duration_ms":404}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:49 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 9f4548cd-5a78-4a4f-a113-94b2a6829646 + Original-Request: + - req_jItuhngRLh3OBU + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_jItuhngRLh3OBU + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP2KuuB1fWySn0XKEWUXu", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871248, + "currency": "eur", + "customer": "cus_PyeiUZlYixpFpZ", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hP2KuuB1fWySn05WVraBL", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP1KuuB1fWySnz03Vo2yF", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:49 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hP2KuuB1fWySn0XKEWUXu + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_jItuhngRLh3OBU","request_duration_ms":1013}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:50 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_RSW0EOvXKVDOsj + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP2KuuB1fWySn0XKEWUXu", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871248, + "currency": "eur", + "customer": "cus_PyeiUZlYixpFpZ", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hP2KuuB1fWySn05WVraBL", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP1KuuB1fWySnz03Vo2yF", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:50 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hP2KuuB1fWySn0XKEWUXu/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_RSW0EOvXKVDOsj","request_duration_ms":347}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:51 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - be7dad5d-c4c0-4359-97ed-2c37022aa5a2 + Original-Request: + - req_opMkWzGDrX3TTW + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_opMkWzGDrX3TTW + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP2KuuB1fWySn0XKEWUXu", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871248, + "currency": "eur", + "customer": "cus_PyeiUZlYixpFpZ", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hP2KuuB1fWySn05WVraBL", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP1KuuB1fWySnz03Vo2yF", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:51 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hP2KuuB1fWySn0XKEWUXu + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_opMkWzGDrX3TTW","request_duration_ms":1124}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:51 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_SuEUXxJcKAACHM + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP2KuuB1fWySn0XKEWUXu", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871248, + "currency": "eur", + "customer": "cus_PyeiUZlYixpFpZ", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hP2KuuB1fWySn05WVraBL", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP1KuuB1fWySnz03Vo2yF", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:51 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..d5ed69d5929 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4242424242424242&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_TD1ICnTqMW4RYP","request_duration_ms":392}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:45 GMT + Content-Type: + - application/json + Content-Length: + - '996' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 68d2582b-1a46-406d-8d18-2ace368db10c + Original-Request: + - req_LdjAk4FM1hpo0U + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_LdjAk4FM1hpo0U + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hOyKuuB1fWySnMzi4d4zE", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "6E6tgVjx6U65iHFV", + "funding": "credit", + "generated_from": null, + "last4": "4242", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871245, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:20:45 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_LdjAk4FM1hpo0U","request_duration_ms":455}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:45 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - c1e6d5c1-e32a-42c6-a740-91cb151954f1 + Original-Request: + - req_E6VsQiT9u5lSaK + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_E6VsQiT9u5lSaK + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyeiIsHCXjEx5v", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871245, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "1D6BD4E6", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:20:45 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hOyKuuB1fWySnMzi4d4zE&payment_method_types[0]=card&capture_method=manual&customer=cus_PyeiIsHCXjEx5v&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_E6VsQiT9u5lSaK","request_duration_ms":416}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:45 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 95380c72-b685-4aad-9e95-386a54a2c352 + Original-Request: + - req_XQa3MYudfzFXtY + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_XQa3MYudfzFXtY + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hOzKuuB1fWySn2BfuNUlf", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871245, + "currency": "eur", + "customer": "cus_PyeiIsHCXjEx5v", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hOyKuuB1fWySnMzi4d4zE", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:46 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOzKuuB1fWySn2BfuNUlf/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_XQa3MYudfzFXtY","request_duration_ms":477}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:47 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - e3142c35-5f72-4c4b-bf20-a44cad45f0b5 + Original-Request: + - req_UgmaT5BH5c9gjk + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_UgmaT5BH5c9gjk + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hOzKuuB1fWySn2BfuNUlf", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871245, + "currency": "eur", + "customer": "cus_PyeiIsHCXjEx5v", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hOzKuuB1fWySn2D5AkAxu", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hOyKuuB1fWySnMzi4d4zE", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:47 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/captures_the_payment.yml new file mode 100644 index 00000000000..0890e522881 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/captures_the_payment.yml @@ -0,0 +1,905 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4000056655665556&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_NSTT4HsXvES8zI","request_duration_ms":1116}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:55 GMT + Content-Type: + - application/json + Content-Length: + - '995' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 763b86b3-0434-4f53-90de-0e86a9a18e4a + Original-Request: + - req_d7wiIIWTC76kjJ + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_d7wiIIWTC76kjJ + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hP8KuuB1fWySnFqFZ163j", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "QOaaYMtlTSm6xJM8", + "funding": "debit", + "generated_from": null, + "last4": "5556", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871255, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:20:55 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_d7wiIIWTC76kjJ","request_duration_ms":474}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:55 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 519dbff1-4400-4473-ba03-3b38e8b5e34d + Original-Request: + - req_SUtRVQTrGlrpx7 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_SUtRVQTrGlrpx7 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyeiRd0uamjkpD", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871255, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "C9D877D7", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:20:55 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hP8KuuB1fWySnFqFZ163j&payment_method_types[0]=card&capture_method=manual&customer=cus_PyeiRd0uamjkpD&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_SUtRVQTrGlrpx7","request_duration_ms":443}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:56 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 20f5aa54-ad41-48aa-8cd4-f1a3c4c05910 + Original-Request: + - req_eXPcpqqf1hZDxS + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_eXPcpqqf1hZDxS + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP9KuuB1fWySn1rE3MV9I", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871255, + "currency": "eur", + "customer": "cus_PyeiRd0uamjkpD", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP8KuuB1fWySnFqFZ163j", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:56 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hP9KuuB1fWySn1rE3MV9I/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_eXPcpqqf1hZDxS","request_duration_ms":473}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:57 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 6498ca7d-8867-4a1f-b723-591e00d8bdf9 + Original-Request: + - req_ZtwX9Ykka4YUV8 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_ZtwX9Ykka4YUV8 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP9KuuB1fWySn1rE3MV9I", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871255, + "currency": "eur", + "customer": "cus_PyeiRd0uamjkpD", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hP9KuuB1fWySn12dUJrfp", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP8KuuB1fWySnFqFZ163j", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:57 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hP9KuuB1fWySn1rE3MV9I + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_ZtwX9Ykka4YUV8","request_duration_ms":1103}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:57 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_YM5wEDEnuXBpBm + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP9KuuB1fWySn1rE3MV9I", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871255, + "currency": "eur", + "customer": "cus_PyeiRd0uamjkpD", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hP9KuuB1fWySn12dUJrfp", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP8KuuB1fWySnFqFZ163j", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:57 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hP9KuuB1fWySn1rE3MV9I/capture + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_YM5wEDEnuXBpBm","request_duration_ms":405}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:59 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fcapture; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 40e231b3-aef9-4771-b9cf-a982dff14990 + Original-Request: + - req_SeSpAM5UPrqWYH + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_SeSpAM5UPrqWYH + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP9KuuB1fWySn1rE3MV9I", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871255, + "currency": "eur", + "customer": "cus_PyeiRd0uamjkpD", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hP9KuuB1fWySn12dUJrfp", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP8KuuB1fWySnFqFZ163j", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:59 GMT +- request: + method: get + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hP9KuuB1fWySn1rE3MV9I + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_SeSpAM5UPrqWYH","request_duration_ms":1532}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:59 GMT + Content-Type: + - application/json + Content-Length: + - '1383' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_0WphKlQD6xRFlt + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP9KuuB1fWySn1rE3MV9I", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 100, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871255, + "currency": "eur", + "customer": "cus_PyeiRd0uamjkpD", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hP9KuuB1fWySn12dUJrfp", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP8KuuB1fWySnFqFZ163j", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "succeeded", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:59 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/returns_payment_intent_id_and_does_not_raise.yml new file mode 100644 index 00000000000..fa7cabf8817 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_Stripe_customer/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/returns_payment_intent_id_and_does_not_raise.yml @@ -0,0 +1,512 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.stripe.com/v1/payment_methods + body: + encoding: UTF-8 + string: type=card&card[number]=4000056655665556&card[exp_month]=12&card[exp_year]=2025&card[cvc]=314 + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_SuEUXxJcKAACHM","request_duration_ms":294}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:52 GMT + Content-Type: + - application/json + Content-Length: + - '995' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_methods; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - b416d5bb-1638-4a2a-a8f4-8c592f1a6f6e + Original-Request: + - req_GasZ8Q7X3U3mI0 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_GasZ8Q7X3U3mI0 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pm_1P8hP5KuuB1fWySnGGKWJfNZ", + "object": "payment_method", + "allow_redisplay": "unspecified", + "billing_details": { + "address": { + "city": null, + "country": null, + "line1": null, + "line2": null, + "postal_code": null, + "state": null + }, + "email": null, + "name": null, + "phone": null + }, + "card": { + "brand": "visa", + "checks": { + "address_line1_check": null, + "address_postal_code_check": null, + "cvc_check": "unchecked" + }, + "country": "US", + "display_brand": "visa", + "exp_month": 12, + "exp_year": 2025, + "fingerprint": "QOaaYMtlTSm6xJM8", + "funding": "debit", + "generated_from": null, + "last4": "5556", + "networks": { + "available": [ + "visa" + ], + "preferred": null + }, + "three_d_secure_usage": { + "supported": true + }, + "wallet": null + }, + "created": 1713871252, + "customer": null, + "livemode": false, + "metadata": {}, + "type": "card" + } + recorded_at: Tue, 23 Apr 2024 11:20:52 GMT +- request: + method: post + uri: https://api.stripe.com/v1/customers + body: + encoding: UTF-8 + string: name=Apple+Customer&email=applecustomer%40example.com + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_GasZ8Q7X3U3mI0","request_duration_ms":408}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:52 GMT + Content-Type: + - application/json + Content-Length: + - '649' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fcustomers; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 5f289aa6-594d-432e-abf9-7d59afba6450 + Original-Request: + - req_04iwSX9RtGGLNc + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_04iwSX9RtGGLNc + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "cus_PyeioItiFsOZMV", + "object": "customer", + "address": null, + "balance": 0, + "created": 1713871252, + "currency": null, + "default_source": null, + "delinquent": false, + "description": null, + "discount": null, + "email": "applecustomer@example.com", + "invoice_prefix": "C9CA4B1C", + "invoice_settings": { + "custom_fields": null, + "default_payment_method": null, + "footer": null, + "rendering_options": null + }, + "livemode": false, + "metadata": {}, + "name": "Apple Customer", + "next_invoice_sequence": 1, + "phone": null, + "preferred_locales": [], + "shipping": null, + "tax_exempt": "none", + "test_clock": null + } + recorded_at: Tue, 23 Apr 2024 11:20:52 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents + body: + encoding: UTF-8 + string: amount=100¤cy=eur&payment_method=pm_1P8hP5KuuB1fWySnGGKWJfNZ&payment_method_types[0]=card&capture_method=manual&customer=cus_PyeioItiFsOZMV&setup_future_usage=off_session + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_04iwSX9RtGGLNc","request_duration_ms":511}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:53 GMT + Content-Type: + - application/json + Content-Length: + - '1368' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents; block-all-mixed-content; + default-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; + img-src 'self'; script-src 'self' 'report-sample'; style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 62229c32-c569-4948-a445-3bcec44b32c5 + Original-Request: + - req_cwRm9yGWWWilV1 + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_cwRm9yGWWWilV1 + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP6KuuB1fWySn1g8Xuc3F", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 0, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871252, + "currency": "eur", + "customer": "cus_PyeioItiFsOZMV", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": null, + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP5KuuB1fWySnGGKWJfNZ", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_confirmation", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:53 GMT +- request: + method: post + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hP6KuuB1fWySn1g8Xuc3F/confirm + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Stripe/v1 RubyBindings/11.1.0 + Authorization: + - "" + Content-Type: + - application/x-www-form-urlencoded + X-Stripe-Client-Telemetry: + - '{"last_request_metrics":{"request_id":"req_cwRm9yGWWWilV1","request_duration_ms":400}}' + Stripe-Version: + - '2024-04-10' + X-Stripe-Client-User-Agent: + - "" + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx + Date: + - Tue, 23 Apr 2024 11:20:54 GMT + Content-Type: + - application/json + Content-Length: + - '1390' + Connection: + - keep-alive + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Methods: + - GET,HEAD,PUT,PATCH,POST,DELETE + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - Request-Id, Stripe-Manage-Version, Stripe-Should-Retry, X-Stripe-External-Auth-Required, + X-Stripe-Privileged-Session-Required + Access-Control-Max-Age: + - '300' + Cache-Control: + - no-cache, no-store + Content-Security-Policy: + - report-uri https://q.stripe.com/csp-report?p=v1%2Fpayment_intents%2F%3Aintent%2Fconfirm; + block-all-mixed-content; default-src 'none'; base-uri 'none'; form-action + 'none'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'report-sample'; + style-src 'self' + Cross-Origin-Opener-Policy-Report-Only: + - same-origin; report-to="coop" + Idempotency-Key: + - 4716d47f-d624-4876-ad10-4c0be48da55d + Original-Request: + - req_NSTT4HsXvES8zI + Report-To: + - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' + Reporting-Endpoints: + - coop="https://q.stripe.com/coop-report" + Request-Id: + - req_NSTT4HsXvES8zI + Stripe-Should-Retry: + - 'false' + Stripe-Version: + - '2024-04-10' + Vary: + - Origin + X-Stripe-Routing-Context-Priority-Tier: + - api-testmode + Strict-Transport-Security: + - max-age=63072000; includeSubDomains; preload + body: + encoding: UTF-8 + string: |- + { + "id": "pi_3P8hP6KuuB1fWySn1g8Xuc3F", + "object": "payment_intent", + "amount": 100, + "amount_capturable": 100, + "amount_details": { + "tip": {} + }, + "amount_received": 0, + "application": null, + "application_fee_amount": null, + "automatic_payment_methods": null, + "canceled_at": null, + "cancellation_reason": null, + "capture_method": "manual", + "client_secret": "", + "confirmation_method": "automatic", + "created": 1713871252, + "currency": "eur", + "customer": "cus_PyeioItiFsOZMV", + "description": null, + "invoice": null, + "last_payment_error": null, + "latest_charge": "ch_3P8hP6KuuB1fWySn1TOxVGOJ", + "livemode": false, + "metadata": {}, + "next_action": null, + "on_behalf_of": null, + "payment_method": "pm_1P8hP5KuuB1fWySnGGKWJfNZ", + "payment_method_configuration_details": null, + "payment_method_options": { + "card": { + "installments": null, + "mandate_options": null, + "network": null, + "request_three_d_secure": "automatic" + } + }, + "payment_method_types": [ + "card" + ], + "processing": null, + "receipt_email": null, + "review": null, + "setup_future_usage": "off_session", + "shipping": null, + "source": null, + "statement_descriptor": null, + "statement_descriptor_suffix": null, + "status": "requires_capture", + "transfer_data": null, + "transfer_group": null + } + recorded_at: Tue, 23 Apr 2024 11:20:54 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml similarity index 89% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml index 44a82d621f1..296b238fecb 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Exceeding_velocity_limit_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_MTnLIBxp9QZPi2","request_duration_ms":529}}' + - '{"last_request_metrics":{"request_id":"req_0P0dFe67uRApKs","request_duration_ms":409}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:07 GMT + - Tue, 23 Apr 2024 11:20:43 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - '09b0f20d-fff3-4742-92c3-dd5365c9ad01' + - d4a19938-529a-4e02-bdc3-e064ed837d87 Original-Request: - - req_1ebsHfB6iwjJOf + - req_tJEw7BTVnIwxON Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_1ebsHfB6iwjJOf + - req_tJEw7BTVnIwxON Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h98KuuB1fWySnPmskOrli", + "id": "pm_1P8hOxKuuB1fWySntaLexRXT", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393607, + "created": 1713871243, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:40:07 GMT + recorded_at: Tue, 23 Apr 2024 11:20:43 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h98KuuB1fWySnPmskOrli&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOxKuuB1fWySntaLexRXT&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_1ebsHfB6iwjJOf","request_duration_ms":577}}' + - '{"last_request_metrics":{"request_id":"req_tJEw7BTVnIwxON","request_duration_ms":425}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:07 GMT + - Tue, 23 Apr 2024 11:20:43 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 8d303864-b4fd-48c3-812e-7fdd7d4651f6 + - 826bc3ae-17b2-462f-80a3-52c36e0a32bf Original-Request: - - req_ClLaOaXNsGN8vL + - req_TD1ICnTqMW4RYP Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_ClLaOaXNsGN8vL + - req_TD1ICnTqMW4RYP Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h99KuuB1fWySn2OfdkSPl", + "id": "pi_3P8hOxKuuB1fWySn0QCLCcvU", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393607, + "created": 1713871243, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h98KuuB1fWySnPmskOrli", + "payment_method": "pm_1P8hOxKuuB1fWySntaLexRXT", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:40:07 GMT + recorded_at: Tue, 23 Apr 2024 11:20:43 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h99KuuB1fWySn2OfdkSPl/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOxKuuB1fWySn0QCLCcvU/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_ClLaOaXNsGN8vL","request_duration_ms":510}}' + - '{"last_request_metrics":{"request_id":"req_TD1ICnTqMW4RYP","request_duration_ms":392}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:08 GMT + - Tue, 23 Apr 2024 11:20:44 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - ea22918b-5183-4f44-ac27-63e7299546d3 + - b1cffb62-959e-4f88-96d8-09fe3dcc4e2e Original-Request: - - req_HGck6NCIT0pJKh + - req_XsFaGGEDA5oXou Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_HGck6NCIT0pJKh + - req_XsFaGGEDA5oXou Stripe-Should-Retry: - 'false' Stripe-Version: @@ -347,13 +347,13 @@ http_interactions: string: | { "error": { - "charge": "ch_3P6h99KuuB1fWySn2Sv33DqP", + "charge": "ch_3P8hOxKuuB1fWySn0WGRPCvo", "code": "card_declined", "decline_code": "card_velocity_exceeded", "doc_url": "https://stripe.com/docs/error-codes/card-declined", "message": "Your card was declined for making repeated attempts too frequently or exceeding its amount limit.", "payment_intent": { - "id": "pi_3P6h99KuuB1fWySn2OfdkSPl", + "id": "pi_3P8hOxKuuB1fWySn0QCLCcvU", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -370,19 +370,19 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393607, + "created": 1713871243, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": { - "charge": "ch_3P6h99KuuB1fWySn2Sv33DqP", + "charge": "ch_3P8hOxKuuB1fWySn0WGRPCvo", "code": "card_declined", "decline_code": "card_velocity_exceeded", "doc_url": "https://stripe.com/docs/error-codes/card-declined", "message": "Your card was declined for making repeated attempts too frequently or exceeding its amount limit.", "payment_method": { - "id": "pm_1P6h98KuuB1fWySnPmskOrli", + "id": "pm_1P8hOxKuuB1fWySntaLexRXT", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -424,7 +424,7 @@ http_interactions: }, "wallet": null }, - "created": 1713393607, + "created": 1713871243, "customer": null, "livemode": false, "metadata": { @@ -433,7 +433,7 @@ http_interactions: }, "type": "card_error" }, - "latest_charge": "ch_3P6h99KuuB1fWySn2Sv33DqP", + "latest_charge": "ch_3P8hOxKuuB1fWySn0WGRPCvo", "livemode": false, "metadata": { }, @@ -465,7 +465,7 @@ http_interactions: "transfer_group": null }, "payment_method": { - "id": "pm_1P6h98KuuB1fWySnPmskOrli", + "id": "pm_1P8hOxKuuB1fWySntaLexRXT", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -507,16 +507,16 @@ http_interactions: }, "wallet": null }, - "created": 1713393607, + "created": 1713871243, "customer": null, "livemode": false, "metadata": { }, "type": "card" }, - "request_log_url": "https://dashboard.stripe.com/test/logs/req_HGck6NCIT0pJKh?t=1713393607", + "request_log_url": "https://dashboard.stripe.com/test/logs/req_XsFaGGEDA5oXou?t=1713871243", "type": "card_error" } } - recorded_at: Wed, 17 Apr 2024 22:40:08 GMT + recorded_at: Tue, 23 Apr 2024 11:20:44 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml similarity index 89% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml index 9c9221e5413..444212ce290 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Expired_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_91pHPi8RnhHsyR","request_duration_ms":1226}}' + - '{"last_request_metrics":{"request_id":"req_FTXU1ZIbyaeQkr","request_duration_ms":432}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:00 GMT + - Tue, 23 Apr 2024 11:20:37 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 95f41437-34b8-485a-8963-822e63ab7c47 + - 88982d68-09f6-4fa6-a572-6089b7a160e0 Original-Request: - - req_vwfQav2GN0SQ4r + - req_gY62TO1N0stfzS Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_vwfQav2GN0SQ4r + - req_gY62TO1N0stfzS Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h92KuuB1fWySn0HDWMel6", + "id": "pm_1P8hOrKuuB1fWySnjiUbqScR", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393600, + "created": 1713871237, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:40:00 GMT + recorded_at: Tue, 23 Apr 2024 11:20:37 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h92KuuB1fWySn0HDWMel6&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOrKuuB1fWySnjiUbqScR&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_vwfQav2GN0SQ4r","request_duration_ms":497}}' + - '{"last_request_metrics":{"request_id":"req_gY62TO1N0stfzS","request_duration_ms":427}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:00 GMT + - Tue, 23 Apr 2024 11:20:38 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 102af3c2-a4d1-4f44-ab50-2a4f827c0cf9 + - f938c98a-bc71-4e87-94d7-b2a92dbf21cd Original-Request: - - req_AcKGwgfHNiqkQ2 + - req_KfMG7sTUwbVfkB Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_AcKGwgfHNiqkQ2 + - req_KfMG7sTUwbVfkB Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h92KuuB1fWySn10XVZK55", + "id": "pi_3P8hOrKuuB1fWySn0tLsTsi5", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393600, + "created": 1713871237, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h92KuuB1fWySn0HDWMel6", + "payment_method": "pm_1P8hOrKuuB1fWySnjiUbqScR", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:40:00 GMT + recorded_at: Tue, 23 Apr 2024 11:20:38 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h92KuuB1fWySn10XVZK55/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOrKuuB1fWySn0tLsTsi5/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_AcKGwgfHNiqkQ2","request_duration_ms":510}}' + - '{"last_request_metrics":{"request_id":"req_KfMG7sTUwbVfkB","request_duration_ms":389}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:02 GMT + - Tue, 23 Apr 2024 11:20:38 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 961364ed-f77a-46c9-8425-bff589bef4d6 + - e2035da6-4fe9-4851-8877-612b765b1b59 Original-Request: - - req_obyVJ21H3H5mhN + - req_D1X2WHpplGz7bG Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_obyVJ21H3H5mhN + - req_D1X2WHpplGz7bG Stripe-Should-Retry: - 'false' Stripe-Version: @@ -347,13 +347,13 @@ http_interactions: string: | { "error": { - "charge": "ch_3P6h92KuuB1fWySn1vimbcUq", + "charge": "ch_3P8hOrKuuB1fWySn0gEvcQdM", "code": "expired_card", "doc_url": "https://stripe.com/docs/error-codes/expired-card", "message": "Your card has expired.", "param": "exp_month", "payment_intent": { - "id": "pi_3P6h92KuuB1fWySn10XVZK55", + "id": "pi_3P8hOrKuuB1fWySn0tLsTsi5", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -370,19 +370,19 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393600, + "created": 1713871237, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": { - "charge": "ch_3P6h92KuuB1fWySn1vimbcUq", + "charge": "ch_3P8hOrKuuB1fWySn0gEvcQdM", "code": "expired_card", "doc_url": "https://stripe.com/docs/error-codes/expired-card", "message": "Your card has expired.", "param": "exp_month", "payment_method": { - "id": "pm_1P6h92KuuB1fWySn0HDWMel6", + "id": "pm_1P8hOrKuuB1fWySnjiUbqScR", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -424,7 +424,7 @@ http_interactions: }, "wallet": null }, - "created": 1713393600, + "created": 1713871237, "customer": null, "livemode": false, "metadata": { @@ -433,7 +433,7 @@ http_interactions: }, "type": "card_error" }, - "latest_charge": "ch_3P6h92KuuB1fWySn1vimbcUq", + "latest_charge": "ch_3P8hOrKuuB1fWySn0gEvcQdM", "livemode": false, "metadata": { }, @@ -465,7 +465,7 @@ http_interactions: "transfer_group": null }, "payment_method": { - "id": "pm_1P6h92KuuB1fWySn0HDWMel6", + "id": "pm_1P8hOrKuuB1fWySnjiUbqScR", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -507,16 +507,16 @@ http_interactions: }, "wallet": null }, - "created": 1713393600, + "created": 1713871237, "customer": null, "livemode": false, "metadata": { }, "type": "card" }, - "request_log_url": "https://dashboard.stripe.com/test/logs/req_obyVJ21H3H5mhN?t=1713393601", + "request_log_url": "https://dashboard.stripe.com/test/logs/req_D1X2WHpplGz7bG?t=1713871238", "type": "card_error" } } - recorded_at: Wed, 17 Apr 2024 22:40:02 GMT + recorded_at: Tue, 23 Apr 2024 11:20:38 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml similarity index 89% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml index 2a4f03f7bed..fb80c6fa30d 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Generic_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_zvf4CAVwSgnYlD","request_duration_ms":325}}' + - '{"last_request_metrics":{"request_id":"req_CLAQeFdk7h5EGj","request_duration_ms":318}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:51 GMT + - Tue, 23 Apr 2024 11:20:29 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 3e2ebf31-c7da-4577-a8dc-1a2b58d16b4f + - '07758b53-1aa2-4a44-8916-d19cad8a069f' Original-Request: - - req_JEskdY1fDUZiGK + - req_0kskJiPnIOJVHG Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_JEskdY1fDUZiGK + - req_0kskJiPnIOJVHG Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8tKuuB1fWySnVkyyCW9S", + "id": "pm_1P8hOjKuuB1fWySnP7gYrBVw", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393591, + "created": 1713871229, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:51 GMT + recorded_at: Tue, 23 Apr 2024 11:20:29 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8tKuuB1fWySnVkyyCW9S&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOjKuuB1fWySnP7gYrBVw&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_JEskdY1fDUZiGK","request_duration_ms":549}}' + - '{"last_request_metrics":{"request_id":"req_0kskJiPnIOJVHG","request_duration_ms":538}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:51 GMT + - Tue, 23 Apr 2024 11:20:30 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - a9b30257-3b69-44bb-b62c-4f1b28088b3d + - d1efddf1-415e-49fb-96b6-06df34262172 Original-Request: - - req_ozBWc8q3xpqvDc + - req_UzfS2TikGjkDvJ Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_ozBWc8q3xpqvDc + - req_UzfS2TikGjkDvJ Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8tKuuB1fWySn0b4wKpwW", + "id": "pi_3P8hOjKuuB1fWySn1ouX7iIF", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393591, + "created": 1713871229, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8tKuuB1fWySnVkyyCW9S", + "payment_method": "pm_1P8hOjKuuB1fWySnP7gYrBVw", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:51 GMT + recorded_at: Tue, 23 Apr 2024 11:20:30 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8tKuuB1fWySn0b4wKpwW/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOjKuuB1fWySn1ouX7iIF/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_ozBWc8q3xpqvDc","request_duration_ms":507}}' + - '{"last_request_metrics":{"request_id":"req_UzfS2TikGjkDvJ","request_duration_ms":409}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:52 GMT + - Tue, 23 Apr 2024 11:20:31 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 0b9dcf4b-a558-4d29-8bd2-39741508a496 + - 8c6748e1-aa46-478d-a479-9a71de90eb22 Original-Request: - - req_P1pWIPxC0iMtgI + - req_gGUfDC9JLGf480 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_P1pWIPxC0iMtgI + - req_gGUfDC9JLGf480 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -347,13 +347,13 @@ http_interactions: string: | { "error": { - "charge": "ch_3P6h8tKuuB1fWySn0h2YuoXV", + "charge": "ch_3P8hOjKuuB1fWySn1cxYKudg", "code": "card_declined", "decline_code": "generic_decline", "doc_url": "https://stripe.com/docs/error-codes/card-declined", "message": "Your card was declined.", "payment_intent": { - "id": "pi_3P6h8tKuuB1fWySn0b4wKpwW", + "id": "pi_3P8hOjKuuB1fWySn1ouX7iIF", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -370,19 +370,19 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393591, + "created": 1713871229, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": { - "charge": "ch_3P6h8tKuuB1fWySn0h2YuoXV", + "charge": "ch_3P8hOjKuuB1fWySn1cxYKudg", "code": "card_declined", "decline_code": "generic_decline", "doc_url": "https://stripe.com/docs/error-codes/card-declined", "message": "Your card was declined.", "payment_method": { - "id": "pm_1P6h8tKuuB1fWySnVkyyCW9S", + "id": "pm_1P8hOjKuuB1fWySnP7gYrBVw", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -424,7 +424,7 @@ http_interactions: }, "wallet": null }, - "created": 1713393591, + "created": 1713871229, "customer": null, "livemode": false, "metadata": { @@ -433,7 +433,7 @@ http_interactions: }, "type": "card_error" }, - "latest_charge": "ch_3P6h8tKuuB1fWySn0h2YuoXV", + "latest_charge": "ch_3P8hOjKuuB1fWySn1cxYKudg", "livemode": false, "metadata": { }, @@ -465,7 +465,7 @@ http_interactions: "transfer_group": null }, "payment_method": { - "id": "pm_1P6h8tKuuB1fWySnVkyyCW9S", + "id": "pm_1P8hOjKuuB1fWySnP7gYrBVw", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -507,16 +507,16 @@ http_interactions: }, "wallet": null }, - "created": 1713393591, + "created": 1713871229, "customer": null, "livemode": false, "metadata": { }, "type": "card" }, - "request_log_url": "https://dashboard.stripe.com/test/logs/req_P1pWIPxC0iMtgI?t=1713393592", + "request_log_url": "https://dashboard.stripe.com/test/logs/req_gGUfDC9JLGf480?t=1713871230", "type": "card_error" } } - recorded_at: Wed, 17 Apr 2024 22:39:53 GMT + recorded_at: Tue, 23 Apr 2024 11:20:31 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml similarity index 89% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml index 0a57cb8215f..f6f8a925294 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Incorrect_CVC_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_AcKGwgfHNiqkQ2","request_duration_ms":510}}' + - '{"last_request_metrics":{"request_id":"req_KfMG7sTUwbVfkB","request_duration_ms":389}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:02 GMT + - Tue, 23 Apr 2024 11:20:39 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - c138f19e-3512-4b4a-ab08-b2d672ecfc54 + - 351a3773-aaaf-480b-a9df-f84107b9e010 Original-Request: - - req_AT9S1WAn7ax8yv + - req_ta6HZdIlldVny4 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_AT9S1WAn7ax8yv + - req_ta6HZdIlldVny4 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h94KuuB1fWySnQFqcyGd2", + "id": "pm_1P8hOtKuuB1fWySnSr39glVr", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393602, + "created": 1713871239, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:40:02 GMT + recorded_at: Tue, 23 Apr 2024 11:20:39 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h94KuuB1fWySnQFqcyGd2&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOtKuuB1fWySnSr39glVr&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_AT9S1WAn7ax8yv","request_duration_ms":600}}' + - '{"last_request_metrics":{"request_id":"req_ta6HZdIlldVny4","request_duration_ms":467}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:03 GMT + - Tue, 23 Apr 2024 11:20:39 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - d290a537-0a3c-4289-a344-9798fab37425 + - 6451ed99-2f09-47ea-9dc0-72a18f36e276 Original-Request: - - req_wjgo9m5BZbNXmh + - req_UFCEYmCStF5gkT Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_wjgo9m5BZbNXmh + - req_UFCEYmCStF5gkT Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h95KuuB1fWySn097LCCVO", + "id": "pi_3P8hOtKuuB1fWySn0wyaR4ua", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393603, + "created": 1713871239, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h94KuuB1fWySnQFqcyGd2", + "payment_method": "pm_1P8hOtKuuB1fWySnSr39glVr", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:40:03 GMT + recorded_at: Tue, 23 Apr 2024 11:20:39 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h95KuuB1fWySn097LCCVO/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOtKuuB1fWySn0wyaR4ua/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_wjgo9m5BZbNXmh","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_UFCEYmCStF5gkT","request_duration_ms":416}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:04 GMT + - Tue, 23 Apr 2024 11:20:40 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 45c87915-37a5-4aec-b237-400cf3fcdb98 + - df4611ab-d527-4c86-a356-c4dae19c4f0c Original-Request: - - req_vnOxwSvTNRDLKP + - req_CSrOegPcnD3VnG Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_vnOxwSvTNRDLKP + - req_CSrOegPcnD3VnG Stripe-Should-Retry: - 'false' Stripe-Version: @@ -347,13 +347,13 @@ http_interactions: string: | { "error": { - "charge": "ch_3P6h95KuuB1fWySn02izQ9TQ", + "charge": "ch_3P8hOtKuuB1fWySn0WkfjXqH", "code": "incorrect_cvc", "doc_url": "https://stripe.com/docs/error-codes/incorrect-cvc", "message": "Your card's security code is incorrect.", "param": "cvc", "payment_intent": { - "id": "pi_3P6h95KuuB1fWySn097LCCVO", + "id": "pi_3P8hOtKuuB1fWySn0wyaR4ua", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -370,19 +370,19 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393603, + "created": 1713871239, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": { - "charge": "ch_3P6h95KuuB1fWySn02izQ9TQ", + "charge": "ch_3P8hOtKuuB1fWySn0WkfjXqH", "code": "incorrect_cvc", "doc_url": "https://stripe.com/docs/error-codes/incorrect-cvc", "message": "Your card's security code is incorrect.", "param": "cvc", "payment_method": { - "id": "pm_1P6h94KuuB1fWySnQFqcyGd2", + "id": "pm_1P8hOtKuuB1fWySnSr39glVr", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -424,7 +424,7 @@ http_interactions: }, "wallet": null }, - "created": 1713393602, + "created": 1713871239, "customer": null, "livemode": false, "metadata": { @@ -433,7 +433,7 @@ http_interactions: }, "type": "card_error" }, - "latest_charge": "ch_3P6h95KuuB1fWySn02izQ9TQ", + "latest_charge": "ch_3P8hOtKuuB1fWySn0WkfjXqH", "livemode": false, "metadata": { }, @@ -465,7 +465,7 @@ http_interactions: "transfer_group": null }, "payment_method": { - "id": "pm_1P6h94KuuB1fWySnQFqcyGd2", + "id": "pm_1P8hOtKuuB1fWySnSr39glVr", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -507,16 +507,16 @@ http_interactions: }, "wallet": null }, - "created": 1713393602, + "created": 1713871239, "customer": null, "livemode": false, "metadata": { }, "type": "card" }, - "request_log_url": "https://dashboard.stripe.com/test/logs/req_vnOxwSvTNRDLKP?t=1713393603", + "request_log_url": "https://dashboard.stripe.com/test/logs/req_CSrOegPcnD3VnG?t=1713871239", "type": "card_error" } } - recorded_at: Wed, 17 Apr 2024 22:40:04 GMT + recorded_at: Tue, 23 Apr 2024 11:20:40 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml similarity index 89% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml index 2f4c58fce13..4214cdd8140 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Insufficient_funds_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_ozBWc8q3xpqvDc","request_duration_ms":507}}' + - '{"last_request_metrics":{"request_id":"req_UzfS2TikGjkDvJ","request_duration_ms":409}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:53 GMT + - Tue, 23 Apr 2024 11:20:31 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 811b2fb6-a22d-4e1c-b24f-99023c6c8c06 + - 6e9a7b4b-4c69-497b-a7eb-45e507e3506d Original-Request: - - req_X81UrQj5D2fIoG + - req_7BzxqpXKYTBsaC Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_X81UrQj5D2fIoG + - req_7BzxqpXKYTBsaC Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8vKuuB1fWySnVKifRHk9", + "id": "pm_1P8hOlKuuB1fWySnMz294q8D", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393593, + "created": 1713871231, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:53 GMT + recorded_at: Tue, 23 Apr 2024 11:20:31 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8vKuuB1fWySnVKifRHk9&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOlKuuB1fWySnMz294q8D&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_X81UrQj5D2fIoG","request_duration_ms":497}}' + - '{"last_request_metrics":{"request_id":"req_7BzxqpXKYTBsaC","request_duration_ms":495}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:54 GMT + - Tue, 23 Apr 2024 11:20:32 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 212396f7-3cd5-491b-95ba-e1dc90a8b0af + - b1371ab7-5dc0-4192-97a9-a2a2e92e1d62 Original-Request: - - req_tdGmWRacIg71uZ + - req_4GGugKYm02eIx4 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_tdGmWRacIg71uZ + - req_4GGugKYm02eIx4 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8vKuuB1fWySn176iLXFn", + "id": "pi_3P8hOlKuuB1fWySn2gfd39po", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393593, + "created": 1713871231, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8vKuuB1fWySnVKifRHk9", + "payment_method": "pm_1P8hOlKuuB1fWySnMz294q8D", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:54 GMT + recorded_at: Tue, 23 Apr 2024 11:20:32 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8vKuuB1fWySn176iLXFn/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOlKuuB1fWySn2gfd39po/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_tdGmWRacIg71uZ","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_4GGugKYm02eIx4","request_duration_ms":415}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:55 GMT + - Tue, 23 Apr 2024 11:20:33 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 19c2ea46-8301-4ca7-a76e-91eafa74a68f + - 94c02762-13f1-4c86-90d7-e78b4d4081a7 Original-Request: - - req_Uinf6vD8KZj9v4 + - req_ZIPBAdotb8jZg4 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_Uinf6vD8KZj9v4 + - req_ZIPBAdotb8jZg4 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -347,13 +347,13 @@ http_interactions: string: | { "error": { - "charge": "ch_3P6h8vKuuB1fWySn1dijUtHM", + "charge": "ch_3P8hOlKuuB1fWySn2U29gWfE", "code": "card_declined", "decline_code": "insufficient_funds", "doc_url": "https://stripe.com/docs/error-codes/card-declined", "message": "Your card has insufficient funds.", "payment_intent": { - "id": "pi_3P6h8vKuuB1fWySn176iLXFn", + "id": "pi_3P8hOlKuuB1fWySn2gfd39po", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -370,19 +370,19 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393593, + "created": 1713871231, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": { - "charge": "ch_3P6h8vKuuB1fWySn1dijUtHM", + "charge": "ch_3P8hOlKuuB1fWySn2U29gWfE", "code": "card_declined", "decline_code": "insufficient_funds", "doc_url": "https://stripe.com/docs/error-codes/card-declined", "message": "Your card has insufficient funds.", "payment_method": { - "id": "pm_1P6h8vKuuB1fWySnVKifRHk9", + "id": "pm_1P8hOlKuuB1fWySnMz294q8D", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -424,7 +424,7 @@ http_interactions: }, "wallet": null }, - "created": 1713393593, + "created": 1713871231, "customer": null, "livemode": false, "metadata": { @@ -433,7 +433,7 @@ http_interactions: }, "type": "card_error" }, - "latest_charge": "ch_3P6h8vKuuB1fWySn1dijUtHM", + "latest_charge": "ch_3P8hOlKuuB1fWySn2U29gWfE", "livemode": false, "metadata": { }, @@ -465,7 +465,7 @@ http_interactions: "transfer_group": null }, "payment_method": { - "id": "pm_1P6h8vKuuB1fWySnVKifRHk9", + "id": "pm_1P8hOlKuuB1fWySnMz294q8D", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -507,16 +507,16 @@ http_interactions: }, "wallet": null }, - "created": 1713393593, + "created": 1713871231, "customer": null, "livemode": false, "metadata": { }, "type": "card" }, - "request_log_url": "https://dashboard.stripe.com/test/logs/req_Uinf6vD8KZj9v4?t=1713393594", + "request_log_url": "https://dashboard.stripe.com/test/logs/req_ZIPBAdotb8jZg4?t=1713871232", "type": "card_error" } } - recorded_at: Wed, 17 Apr 2024 22:39:55 GMT + recorded_at: Tue, 23 Apr 2024 11:20:33 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml similarity index 89% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml index 0fc939c873b..58edacb7028 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Lost_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_tdGmWRacIg71uZ","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_4GGugKYm02eIx4","request_duration_ms":415}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:55 GMT + - Tue, 23 Apr 2024 11:20:33 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - d0d41881-d7af-4ce4-a47c-4ae4b0843c6e + - 4d397d2a-d89b-4fd8-866f-74c03f9ae451 Original-Request: - - req_xLfba5hGPhEt2G + - req_Tk2Da6Ib9v7iwQ Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_xLfba5hGPhEt2G + - req_Tk2Da6Ib9v7iwQ Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8xKuuB1fWySnLRqxbX0I", + "id": "pm_1P8hOnKuuB1fWySnx8EJpGhb", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393595, + "created": 1713871233, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:55 GMT + recorded_at: Tue, 23 Apr 2024 11:20:33 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8xKuuB1fWySnLRqxbX0I&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOnKuuB1fWySnx8EJpGhb&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_xLfba5hGPhEt2G","request_duration_ms":496}}' + - '{"last_request_metrics":{"request_id":"req_Tk2Da6Ib9v7iwQ","request_duration_ms":439}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:56 GMT + - Tue, 23 Apr 2024 11:20:34 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - c8d47cf3-ea2b-4a50-8591-18fa853b3a59 + - c39f7b2f-badb-4c89-b5e4-ec3627b4f0e7 Original-Request: - - req_64JFtjubv6sXiB + - req_HbCKCMYMlXyGXr Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_64JFtjubv6sXiB + - req_HbCKCMYMlXyGXr Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8xKuuB1fWySn1DJmrN9c", + "id": "pi_3P8hOnKuuB1fWySn1Lfg4kYU", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393595, + "created": 1713871233, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8xKuuB1fWySnLRqxbX0I", + "payment_method": "pm_1P8hOnKuuB1fWySnx8EJpGhb", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:56 GMT + recorded_at: Tue, 23 Apr 2024 11:20:34 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8xKuuB1fWySn1DJmrN9c/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOnKuuB1fWySn1Lfg4kYU/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_64JFtjubv6sXiB","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_HbCKCMYMlXyGXr","request_duration_ms":411}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:57 GMT + - Tue, 23 Apr 2024 11:20:35 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 0a23bb08-3af7-4271-a71c-8bcfc1270f8d + - 21964356-c5c7-4e3a-97e2-d163adf94548 Original-Request: - - req_pHn2N3UwZjAJka + - req_MzZhKZKuZqs3iH Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_pHn2N3UwZjAJka + - req_MzZhKZKuZqs3iH Stripe-Should-Retry: - 'false' Stripe-Version: @@ -347,13 +347,13 @@ http_interactions: string: | { "error": { - "charge": "ch_3P6h8xKuuB1fWySn1og4ys7e", + "charge": "ch_3P8hOnKuuB1fWySn12NqEdJr", "code": "card_declined", "decline_code": "lost_card", "doc_url": "https://stripe.com/docs/error-codes/card-declined", "message": "Your card was declined.", "payment_intent": { - "id": "pi_3P6h8xKuuB1fWySn1DJmrN9c", + "id": "pi_3P8hOnKuuB1fWySn1Lfg4kYU", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -370,19 +370,19 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393595, + "created": 1713871233, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": { - "charge": "ch_3P6h8xKuuB1fWySn1og4ys7e", + "charge": "ch_3P8hOnKuuB1fWySn12NqEdJr", "code": "card_declined", "decline_code": "lost_card", "doc_url": "https://stripe.com/docs/error-codes/card-declined", "message": "Your card was declined.", "payment_method": { - "id": "pm_1P6h8xKuuB1fWySnLRqxbX0I", + "id": "pm_1P8hOnKuuB1fWySnx8EJpGhb", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -424,7 +424,7 @@ http_interactions: }, "wallet": null }, - "created": 1713393595, + "created": 1713871233, "customer": null, "livemode": false, "metadata": { @@ -433,7 +433,7 @@ http_interactions: }, "type": "card_error" }, - "latest_charge": "ch_3P6h8xKuuB1fWySn1og4ys7e", + "latest_charge": "ch_3P8hOnKuuB1fWySn12NqEdJr", "livemode": false, "metadata": { }, @@ -465,7 +465,7 @@ http_interactions: "transfer_group": null }, "payment_method": { - "id": "pm_1P6h8xKuuB1fWySnLRqxbX0I", + "id": "pm_1P8hOnKuuB1fWySnx8EJpGhb", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -507,16 +507,16 @@ http_interactions: }, "wallet": null }, - "created": 1713393595, + "created": 1713871233, "customer": null, "livemode": false, "metadata": { }, "type": "card" }, - "request_log_url": "https://dashboard.stripe.com/test/logs/req_pHn2N3UwZjAJka?t=1713393596", + "request_log_url": "https://dashboard.stripe.com/test/logs/req_MzZhKZKuZqs3iH?t=1713871234", "type": "card_error" } } - recorded_at: Wed, 17 Apr 2024 22:39:57 GMT + recorded_at: Tue, 23 Apr 2024 11:20:35 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml similarity index 89% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml index 295baaa8f78..27adaf9c49a 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Processing_error_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_wjgo9m5BZbNXmh","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_UFCEYmCStF5gkT","request_duration_ms":416}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:05 GMT + - Tue, 23 Apr 2024 11:20:41 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - d5fc1c0d-9ed9-4c00-acf9-f4be04c6b19a + - 60897254-a14b-4cc0-ab5d-edcaec713df6 Original-Request: - - req_vIHentAe5XkqId + - req_0ABTeq9p7qRCrY Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_vIHentAe5XkqId + - req_0ABTeq9p7qRCrY Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h96KuuB1fWySnYl63gMcD", + "id": "pm_1P8hOvKuuB1fWySnmICExK3O", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393604, + "created": 1713871241, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:40:05 GMT + recorded_at: Tue, 23 Apr 2024 11:20:41 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h96KuuB1fWySnYl63gMcD&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOvKuuB1fWySnmICExK3O&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_vIHentAe5XkqId","request_duration_ms":577}}' + - '{"last_request_metrics":{"request_id":"req_0ABTeq9p7qRCrY","request_duration_ms":463}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:05 GMT + - Tue, 23 Apr 2024 11:20:41 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - c11e2fb3-ceab-4dfe-8d7a-96280372a227 + - 0ef06f67-601c-499c-9882-04a35311c597 Original-Request: - - req_MTnLIBxp9QZPi2 + - req_0P0dFe67uRApKs Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_MTnLIBxp9QZPi2 + - req_0P0dFe67uRApKs Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h97KuuB1fWySn0bvt3XeL", + "id": "pi_3P8hOvKuuB1fWySn0gssyD54", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393605, + "created": 1713871241, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h96KuuB1fWySnYl63gMcD", + "payment_method": "pm_1P8hOvKuuB1fWySnmICExK3O", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:40:05 GMT + recorded_at: Tue, 23 Apr 2024 11:20:41 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h97KuuB1fWySn0bvt3XeL/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOvKuuB1fWySn0gssyD54/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_MTnLIBxp9QZPi2","request_duration_ms":529}}' + - '{"last_request_metrics":{"request_id":"req_0P0dFe67uRApKs","request_duration_ms":409}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:40:06 GMT + - Tue, 23 Apr 2024 11:20:42 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 483ca1ff-5a07-41ab-bebf-f2ca9dc6531e + - 3fe19571-82c8-4409-9e74-910a63b99ef3 Original-Request: - - req_wyhh7XdnfzCAm0 + - req_QTxZT4if0gpdwK Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_wyhh7XdnfzCAm0 + - req_QTxZT4if0gpdwK Stripe-Should-Retry: - 'false' Stripe-Version: @@ -347,12 +347,12 @@ http_interactions: string: | { "error": { - "charge": "ch_3P6h97KuuB1fWySn07xJWGvn", + "charge": "ch_3P8hOvKuuB1fWySn0Q1qaMc9", "code": "processing_error", "doc_url": "https://stripe.com/docs/error-codes/processing-error", "message": "An error occurred while processing your card. Try again in a little bit.", "payment_intent": { - "id": "pi_3P6h97KuuB1fWySn0bvt3XeL", + "id": "pi_3P8hOvKuuB1fWySn0gssyD54", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -369,18 +369,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393605, + "created": 1713871241, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": { - "charge": "ch_3P6h97KuuB1fWySn07xJWGvn", + "charge": "ch_3P8hOvKuuB1fWySn0Q1qaMc9", "code": "processing_error", "doc_url": "https://stripe.com/docs/error-codes/processing-error", "message": "An error occurred while processing your card. Try again in a little bit.", "payment_method": { - "id": "pm_1P6h96KuuB1fWySnYl63gMcD", + "id": "pm_1P8hOvKuuB1fWySnmICExK3O", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -422,7 +422,7 @@ http_interactions: }, "wallet": null }, - "created": 1713393604, + "created": 1713871241, "customer": null, "livemode": false, "metadata": { @@ -431,7 +431,7 @@ http_interactions: }, "type": "card_error" }, - "latest_charge": "ch_3P6h97KuuB1fWySn07xJWGvn", + "latest_charge": "ch_3P8hOvKuuB1fWySn0Q1qaMc9", "livemode": false, "metadata": { }, @@ -463,7 +463,7 @@ http_interactions: "transfer_group": null }, "payment_method": { - "id": "pm_1P6h96KuuB1fWySnYl63gMcD", + "id": "pm_1P8hOvKuuB1fWySnmICExK3O", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -505,16 +505,16 @@ http_interactions: }, "wallet": null }, - "created": 1713393604, + "created": 1713871241, "customer": null, "livemode": false, "metadata": { }, "type": "card" }, - "request_log_url": "https://dashboard.stripe.com/test/logs/req_wyhh7XdnfzCAm0?t=1713393605", + "request_log_url": "https://dashboard.stripe.com/test/logs/req_QTxZT4if0gpdwK?t=1713871241", "type": "card_error" } } - recorded_at: Wed, 17 Apr 2024 22:40:06 GMT + recorded_at: Tue, 23 Apr 2024 11:20:42 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml similarity index 89% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml index 160c03b9afa..372cba76f7f 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_invalid/invalid_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Stolen_card_decline/raises_Stripe_error_with_payment_intent_last_payment_error_as_message.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_64JFtjubv6sXiB","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_HbCKCMYMlXyGXr","request_duration_ms":411}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:57 GMT + - Tue, 23 Apr 2024 11:20:35 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 9b80cc2a-8752-4ccc-949c-427e3892c6f8 + - 03e5054a-e24b-4f76-81d6-55cf44579543 Original-Request: - - req_VroYwmmGAe7bGf + - req_zP0BeHy4YnIt0l Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_VroYwmmGAe7bGf + - req_zP0BeHy4YnIt0l Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8zKuuB1fWySnyte7TuZO", + "id": "pm_1P8hOpKuuB1fWySnOlYgiKQ7", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393597, + "created": 1713871235, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:57 GMT + recorded_at: Tue, 23 Apr 2024 11:20:35 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8zKuuB1fWySnyte7TuZO&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOpKuuB1fWySnOlYgiKQ7&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_VroYwmmGAe7bGf","request_duration_ms":499}}' + - '{"last_request_metrics":{"request_id":"req_zP0BeHy4YnIt0l","request_duration_ms":433}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:58 GMT + - Tue, 23 Apr 2024 11:20:36 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 005b8a2f-5672-4d21-aebe-188d3bb56506 + - 7857cdf4-bb31-4f83-b0ba-764680363e61 Original-Request: - - req_91pHPi8RnhHsyR + - req_FTXU1ZIbyaeQkr Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_91pHPi8RnhHsyR + - req_FTXU1ZIbyaeQkr Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h90KuuB1fWySn2SMGU8mf", + "id": "pi_3P8hOpKuuB1fWySn02Y7jLP8", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393598, + "created": 1713871235, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8zKuuB1fWySnyte7TuZO", + "payment_method": "pm_1P8hOpKuuB1fWySnOlYgiKQ7", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:58 GMT + recorded_at: Tue, 23 Apr 2024 11:20:36 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h90KuuB1fWySn2SMGU8mf/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOpKuuB1fWySn02Y7jLP8/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_91pHPi8RnhHsyR","request_duration_ms":1226}}' + - '{"last_request_metrics":{"request_id":"req_FTXU1ZIbyaeQkr","request_duration_ms":432}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:59 GMT + - Tue, 23 Apr 2024 11:20:37 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 37315a7f-b15c-4f95-88ad-0ef2f556d2da + - f77c4d0f-c4e8-49aa-98b4-29df76dbb935 Original-Request: - - req_tJpyXlIUqME2C6 + - req_bEvAJU8I9JI3lP Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_tJpyXlIUqME2C6 + - req_bEvAJU8I9JI3lP Stripe-Should-Retry: - 'false' Stripe-Version: @@ -347,13 +347,13 @@ http_interactions: string: | { "error": { - "charge": "ch_3P6h90KuuB1fWySn2uILaF5P", + "charge": "ch_3P8hOpKuuB1fWySn03R1BqjO", "code": "card_declined", "decline_code": "stolen_card", "doc_url": "https://stripe.com/docs/error-codes/card-declined", "message": "Your card was declined.", "payment_intent": { - "id": "pi_3P6h90KuuB1fWySn2SMGU8mf", + "id": "pi_3P8hOpKuuB1fWySn02Y7jLP8", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -370,19 +370,19 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393598, + "created": 1713871235, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": { - "charge": "ch_3P6h90KuuB1fWySn2uILaF5P", + "charge": "ch_3P8hOpKuuB1fWySn03R1BqjO", "code": "card_declined", "decline_code": "stolen_card", "doc_url": "https://stripe.com/docs/error-codes/card-declined", "message": "Your card was declined.", "payment_method": { - "id": "pm_1P6h8zKuuB1fWySnyte7TuZO", + "id": "pm_1P8hOpKuuB1fWySnOlYgiKQ7", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -424,7 +424,7 @@ http_interactions: }, "wallet": null }, - "created": 1713393597, + "created": 1713871235, "customer": null, "livemode": false, "metadata": { @@ -433,7 +433,7 @@ http_interactions: }, "type": "card_error" }, - "latest_charge": "ch_3P6h90KuuB1fWySn2uILaF5P", + "latest_charge": "ch_3P8hOpKuuB1fWySn03R1BqjO", "livemode": false, "metadata": { }, @@ -465,7 +465,7 @@ http_interactions: "transfer_group": null }, "payment_method": { - "id": "pm_1P6h8zKuuB1fWySnyte7TuZO", + "id": "pm_1P8hOpKuuB1fWySnOlYgiKQ7", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -507,16 +507,16 @@ http_interactions: }, "wallet": null }, - "created": 1713393597, + "created": 1713871235, "customer": null, "livemode": false, "metadata": { }, "type": "card" }, - "request_log_url": "https://dashboard.stripe.com/test/logs/req_tJpyXlIUqME2C6?t=1713393599", + "request_log_url": "https://dashboard.stripe.com/test/logs/req_bEvAJU8I9JI3lP?t=1713871236", "type": "card_error" } } - recorded_at: Wed, 17 Apr 2024 22:39:59 GMT + recorded_at: Tue, 23 Apr 2024 11:20:37 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml index 87d9f2b0f00..044f8e4852a 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_8RoSQ8dLWnQaG2","request_duration_ms":946}}' + - '{"last_request_metrics":{"request_id":"req_kYtLGywFxGssP5","request_duration_ms":1022}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:56 GMT + - Tue, 23 Apr 2024 11:19:37 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - dc2bb939-488a-4e51-acd0-f41ddadbff8e + - 7dd9ec98-ec26-49e5-8a2e-e55271f1e8ca Original-Request: - - req_yDVoUX6jGomVz3 + - req_NRjdFQhRkTMioQ Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_yDVoUX6jGomVz3 + - req_NRjdFQhRkTMioQ Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h80KuuB1fWySnKLIYVtP4", + "id": "pm_1P8hNtKuuB1fWySnC8hS8ai0", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393536, + "created": 1713871177, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:56 GMT + recorded_at: Tue, 23 Apr 2024 11:19:37 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h80KuuB1fWySnKLIYVtP4&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNtKuuB1fWySnC8hS8ai0&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_yDVoUX6jGomVz3","request_duration_ms":521}}' + - '{"last_request_metrics":{"request_id":"req_NRjdFQhRkTMioQ","request_duration_ms":512}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:57 GMT + - Tue, 23 Apr 2024 11:19:37 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - d56f56a8-973f-4586-baed-3d6321ccfedd + - 97db8c6b-3383-421e-9ccd-99f12dcd4b37 Original-Request: - - req_7zJLlUTwf7naGK + - req_NrilVTb819m4pV Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_7zJLlUTwf7naGK + - req_NrilVTb819m4pV Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h81KuuB1fWySn1i3iTLoX", + "id": "pi_3P8hNtKuuB1fWySn2oOeGD9B", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393537, + "created": 1713871177, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h80KuuB1fWySnKLIYVtP4", + "payment_method": "pm_1P8hNtKuuB1fWySnC8hS8ai0", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:57 GMT + recorded_at: Tue, 23 Apr 2024 11:19:38 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h81KuuB1fWySn1i3iTLoX/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNtKuuB1fWySn2oOeGD9B/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_7zJLlUTwf7naGK","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_NrilVTb819m4pV","request_duration_ms":612}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:58 GMT + - Tue, 23 Apr 2024 11:19:39 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - e0e61825-c787-4fce-8f17-c83e0ef3e61c + - 9308d030-49e2-49b5-83cf-35abd58e60b2 Original-Request: - - req_79R8PUCuDi3D9P + - req_FKzxCoUcrbqye9 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_79R8PUCuDi3D9P + - req_FKzxCoUcrbqye9 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h81KuuB1fWySn1i3iTLoX", + "id": "pi_3P8hNtKuuB1fWySn2oOeGD9B", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393537, + "created": 1713871177, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h81KuuB1fWySn1eMa5DyD", + "latest_charge": "ch_3P8hNtKuuB1fWySn27ThUZBq", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h80KuuB1fWySnKLIYVtP4", + "payment_method": "pm_1P8hNtKuuB1fWySnC8hS8ai0", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:58 GMT + recorded_at: Tue, 23 Apr 2024 11:19:39 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h81KuuB1fWySn1i3iTLoX + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNtKuuB1fWySn2oOeGD9B body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_79R8PUCuDi3D9P","request_duration_ms":993}}' + - '{"last_request_metrics":{"request_id":"req_FKzxCoUcrbqye9","request_duration_ms":983}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:58 GMT + - Tue, 23 Apr 2024 11:19:39 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_8YvzhYldSRubBW + - req_TIRR4OFr4m0I4b Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h81KuuB1fWySn1i3iTLoX", + "id": "pi_3P8hNtKuuB1fWySn2oOeGD9B", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393537, + "created": 1713871177, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h81KuuB1fWySn1eMa5DyD", + "latest_charge": "ch_3P8hNtKuuB1fWySn27ThUZBq", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h80KuuB1fWySnKLIYVtP4", + "payment_method": "pm_1P8hNtKuuB1fWySnC8hS8ai0", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:58 GMT + recorded_at: Tue, 23 Apr 2024 11:19:39 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h81KuuB1fWySn1i3iTLoX/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNtKuuB1fWySn2oOeGD9B/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_8YvzhYldSRubBW","request_duration_ms":435}}' + - '{"last_request_metrics":{"request_id":"req_TIRR4OFr4m0I4b","request_duration_ms":340}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:00 GMT + - Tue, 23 Apr 2024 11:19:40 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 25ffa565-65dd-44f1-b1de-5d1f834d0c07 + - 14f9ae29-367b-4368-b016-8ef7cb7793c8 Original-Request: - - req_QHmUBQF84F7qG1 + - req_Hk2fDQ8IvV95Jc Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_QHmUBQF84F7qG1 + - req_Hk2fDQ8IvV95Jc Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h81KuuB1fWySn1i3iTLoX", + "id": "pi_3P8hNtKuuB1fWySn2oOeGD9B", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393537, + "created": 1713871177, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h81KuuB1fWySn1eMa5DyD", + "latest_charge": "ch_3P8hNtKuuB1fWySn27ThUZBq", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h80KuuB1fWySnKLIYVtP4", + "payment_method": "pm_1P8hNtKuuB1fWySnC8hS8ai0", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:00 GMT + recorded_at: Tue, 23 Apr 2024 11:19:40 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h81KuuB1fWySn1i3iTLoX + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNtKuuB1fWySn2oOeGD9B body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_QHmUBQF84F7qG1","request_duration_ms":1124}}' + - '{"last_request_metrics":{"request_id":"req_Hk2fDQ8IvV95Jc","request_duration_ms":1001}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:00 GMT + - Tue, 23 Apr 2024 11:19:40 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_lW3Bslok4Lawnx + - req_LKa5sZbf9NNCJ0 Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h81KuuB1fWySn1i3iTLoX", + "id": "pi_3P8hNtKuuB1fWySn2oOeGD9B", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393537, + "created": 1713871177, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h81KuuB1fWySn1eMa5DyD", + "latest_charge": "ch_3P8hNtKuuB1fWySn27ThUZBq", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h80KuuB1fWySnKLIYVtP4", + "payment_method": "pm_1P8hNtKuuB1fWySnC8hS8ai0", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:00 GMT + recorded_at: Tue, 23 Apr 2024 11:19:40 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml index 0a231d2704f..260b75c1db5 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_American_Express/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_Op5E047dEuFump","request_duration_ms":405}}' + - '{"last_request_metrics":{"request_id":"req_azV3R41xItqtxT","request_duration_ms":408}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:54 GMT + - Tue, 23 Apr 2024 11:19:34 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - c2c01d7e-8dba-4820-944c-529925047b7e + - 55cdc358-de43-428d-a4e2-73ef80c0e8de Original-Request: - - req_sQ1BbnbMqtgWCv + - req_h51EmrXIH4HXSy Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_sQ1BbnbMqtgWCv + - req_h51EmrXIH4HXSy Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7yKuuB1fWySnAjXTMD0L", + "id": "pm_1P8hNqKuuB1fWySnJ6XqeFlN", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393534, + "created": 1713871174, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:54 GMT + recorded_at: Tue, 23 Apr 2024 11:19:35 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7yKuuB1fWySnAjXTMD0L&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNqKuuB1fWySnJ6XqeFlN&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_sQ1BbnbMqtgWCv","request_duration_ms":496}}' + - '{"last_request_metrics":{"request_id":"req_h51EmrXIH4HXSy","request_duration_ms":421}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:55 GMT + - Tue, 23 Apr 2024 11:19:35 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 9386dac8-1c19-4906-83cf-f2af342a6229 + - 1883fad3-3893-403c-a2f8-e4610272a7da Original-Request: - - req_mXHokzUAHJQ1zS + - req_sDHNMgqJB65g50 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_mXHokzUAHJQ1zS + - req_sDHNMgqJB65g50 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7zKuuB1fWySn1IOJf23O", + "id": "pi_3P8hNrKuuB1fWySn2DJrs4FT", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393535, + "created": 1713871175, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7yKuuB1fWySnAjXTMD0L", + "payment_method": "pm_1P8hNqKuuB1fWySnJ6XqeFlN", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:55 GMT + recorded_at: Tue, 23 Apr 2024 11:19:35 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7zKuuB1fWySn1IOJf23O/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNrKuuB1fWySn2DJrs4FT/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_mXHokzUAHJQ1zS","request_duration_ms":508}}' + - '{"last_request_metrics":{"request_id":"req_sDHNMgqJB65g50","request_duration_ms":444}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:56 GMT + - Tue, 23 Apr 2024 11:19:36 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 0e55b45a-9dfe-478d-8533-891777278c6d + - 2ad557c9-fa28-4f41-8a0b-2003b801b68b Original-Request: - - req_8RoSQ8dLWnQaG2 + - req_kYtLGywFxGssP5 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_8RoSQ8dLWnQaG2 + - req_kYtLGywFxGssP5 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7zKuuB1fWySn1IOJf23O", + "id": "pi_3P8hNrKuuB1fWySn2DJrs4FT", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393535, + "created": 1713871175, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7zKuuB1fWySn12dvB53S", + "latest_charge": "ch_3P8hNrKuuB1fWySn2XcS6yFA", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7yKuuB1fWySnAjXTMD0L", + "payment_method": "pm_1P8hNqKuuB1fWySnJ6XqeFlN", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:56 GMT + recorded_at: Tue, 23 Apr 2024 11:19:36 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml index ace626cb3ae..e4016493d7b 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_3z0b70bAwXWXdV","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_bR8Ns6vD0QQNye","request_duration_ms":894}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:29 GMT + - Tue, 23 Apr 2024 11:20:08 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 85034cd4-c0be-46d4-9682-7dd3ebcf5da9 + - d6622af2-c973-40ff-8461-e836f2dfc59d Original-Request: - - req_belJapNFhTfYji + - req_AKQ9x6bEHaqp7O Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_belJapNFhTfYji + - req_AKQ9x6bEHaqp7O Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8XKuuB1fWySnVdMtfDOI", + "id": "pm_1P8hONKuuB1fWySno9Mcl2ic", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393569, + "created": 1713871208, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:29 GMT + recorded_at: Tue, 23 Apr 2024 11:20:08 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8XKuuB1fWySnVdMtfDOI&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hONKuuB1fWySno9Mcl2ic&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_belJapNFhTfYji","request_duration_ms":455}}' + - '{"last_request_metrics":{"request_id":"req_AKQ9x6bEHaqp7O","request_duration_ms":423}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:30 GMT + - Tue, 23 Apr 2024 11:20:08 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - c33adf33-7e60-4ee6-b785-38eb34dcfe33 + - cb90cc82-5704-4771-930f-fdf5f9a6fcd2 Original-Request: - - req_H8BuN9wUGP5BSM + - req_nmIHWKLnoJo04s Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_H8BuN9wUGP5BSM + - req_nmIHWKLnoJo04s Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8XKuuB1fWySn2MhbFPiK", + "id": "pi_3P8hOOKuuB1fWySn2Odt72kl", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393569, + "created": 1713871208, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8XKuuB1fWySnVdMtfDOI", + "payment_method": "pm_1P8hONKuuB1fWySno9Mcl2ic", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:30 GMT + recorded_at: Tue, 23 Apr 2024 11:20:08 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8XKuuB1fWySn2MhbFPiK/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOOKuuB1fWySn2Odt72kl/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_H8BuN9wUGP5BSM","request_duration_ms":537}}' + - '{"last_request_metrics":{"request_id":"req_nmIHWKLnoJo04s","request_duration_ms":508}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:31 GMT + - Tue, 23 Apr 2024 11:20:09 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 607660cd-97a2-4ec4-a5be-b9813e87360f + - 100c875c-35f0-4c72-a966-bbb696c46fed Original-Request: - - req_VfWUNSJ16yKaDM + - req_DKBvjDBoTGkeUT Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_VfWUNSJ16yKaDM + - req_DKBvjDBoTGkeUT Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8XKuuB1fWySn2MhbFPiK", + "id": "pi_3P8hOOKuuB1fWySn2Odt72kl", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393569, + "created": 1713871208, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8XKuuB1fWySn27vTFz5x", + "latest_charge": "ch_3P8hOOKuuB1fWySn230U2EUB", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8XKuuB1fWySnVdMtfDOI", + "payment_method": "pm_1P8hONKuuB1fWySno9Mcl2ic", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:31 GMT + recorded_at: Tue, 23 Apr 2024 11:20:09 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8XKuuB1fWySn2MhbFPiK + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOOKuuB1fWySn2Odt72kl body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_VfWUNSJ16yKaDM","request_duration_ms":996}}' + - '{"last_request_metrics":{"request_id":"req_DKBvjDBoTGkeUT","request_duration_ms":938}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:31 GMT + - Tue, 23 Apr 2024 11:20:09 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_V3NhiQRMAVdhG5 + - req_p0BWdhdkOVIWYG Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8XKuuB1fWySn2MhbFPiK", + "id": "pi_3P8hOOKuuB1fWySn2Odt72kl", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393569, + "created": 1713871208, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8XKuuB1fWySn27vTFz5x", + "latest_charge": "ch_3P8hOOKuuB1fWySn230U2EUB", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8XKuuB1fWySnVdMtfDOI", + "payment_method": "pm_1P8hONKuuB1fWySno9Mcl2ic", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:31 GMT + recorded_at: Tue, 23 Apr 2024 11:20:09 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8XKuuB1fWySn2MhbFPiK/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOOKuuB1fWySn2Odt72kl/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_V3NhiQRMAVdhG5","request_duration_ms":407}}' + - '{"last_request_metrics":{"request_id":"req_p0BWdhdkOVIWYG","request_duration_ms":314}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:32 GMT + - Tue, 23 Apr 2024 11:20:10 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 9ed1472d-bee6-44be-84b5-3295c458d1e4 + - a95287aa-0422-4a15-bfe5-81f03857c889 Original-Request: - - req_Zm7KQZK83zAent + - req_pK8yffh9OIdizQ Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_Zm7KQZK83zAent + - req_pK8yffh9OIdizQ Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8XKuuB1fWySn2MhbFPiK", + "id": "pi_3P8hOOKuuB1fWySn2Odt72kl", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393569, + "created": 1713871208, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8XKuuB1fWySn27vTFz5x", + "latest_charge": "ch_3P8hOOKuuB1fWySn230U2EUB", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8XKuuB1fWySnVdMtfDOI", + "payment_method": "pm_1P8hONKuuB1fWySno9Mcl2ic", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:32 GMT + recorded_at: Tue, 23 Apr 2024 11:20:11 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8XKuuB1fWySn2MhbFPiK + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOOKuuB1fWySn2Odt72kl body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_Zm7KQZK83zAent","request_duration_ms":1124}}' + - '{"last_request_metrics":{"request_id":"req_pK8yffh9OIdizQ","request_duration_ms":1033}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:32 GMT + - Tue, 23 Apr 2024 11:20:11 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_hfwFTTxVfnyp1F + - req_JAV7p6VHbcflfL Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8XKuuB1fWySn2MhbFPiK", + "id": "pi_3P8hOOKuuB1fWySn2Odt72kl", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393569, + "created": 1713871208, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8XKuuB1fWySn27vTFz5x", + "latest_charge": "ch_3P8hOOKuuB1fWySn230U2EUB", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8XKuuB1fWySnVdMtfDOI", + "payment_method": "pm_1P8hONKuuB1fWySno9Mcl2ic", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:33 GMT + recorded_at: Tue, 23 Apr 2024 11:20:11 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml index 154c7ef5535..e410bd911ec 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_BCcard_and_DinaCard/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_I3pl4WWcmSdR3t","request_duration_ms":323}}' + - '{"last_request_metrics":{"request_id":"req_ddoELzhmVk5L54","request_duration_ms":306}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:27 GMT + - Tue, 23 Apr 2024 11:20:05 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 7e7c53f3-778d-4cf6-99b8-e9d2e323847c + - a9cc5447-3eca-4e18-a389-75afbedf4303 Original-Request: - - req_R5sPMLGXRV4s9f + - req_XOTBaA5jnWCyEJ Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_R5sPMLGXRV4s9f + - req_XOTBaA5jnWCyEJ Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8VKuuB1fWySnG6WGYjOq", + "id": "pm_1P8hOLKuuB1fWySn72k0uhtc", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393567, + "created": 1713871205, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:27 GMT + recorded_at: Tue, 23 Apr 2024 11:20:05 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8VKuuB1fWySnG6WGYjOq&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOLKuuB1fWySn72k0uhtc&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_R5sPMLGXRV4s9f","request_duration_ms":476}}' + - '{"last_request_metrics":{"request_id":"req_XOTBaA5jnWCyEJ","request_duration_ms":442}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:27 GMT + - Tue, 23 Apr 2024 11:20:06 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 9f4c16b6-e857-4835-a8c0-a898a480bc8d + - d568f439-f540-48be-8b8a-d333b20e6271 Original-Request: - - req_oiMNzBLhwBnOq5 + - req_hkoU27ho7VXuVC Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_oiMNzBLhwBnOq5 + - req_hkoU27ho7VXuVC Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8VKuuB1fWySn20Fo9znJ", + "id": "pi_3P8hOMKuuB1fWySn0xktqmNp", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393567, + "created": 1713871206, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8VKuuB1fWySnG6WGYjOq", + "payment_method": "pm_1P8hOLKuuB1fWySn72k0uhtc", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:27 GMT + recorded_at: Tue, 23 Apr 2024 11:20:06 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8VKuuB1fWySn20Fo9znJ/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOMKuuB1fWySn0xktqmNp/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_oiMNzBLhwBnOq5","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_hkoU27ho7VXuVC","request_duration_ms":407}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:28 GMT + - Tue, 23 Apr 2024 11:20:07 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - f5c42d6a-7ba8-484a-9729-b77ccd7e9702 + - aa80c1db-6bf5-40dd-bd27-4d3e30ff2d5a Original-Request: - - req_3z0b70bAwXWXdV + - req_bR8Ns6vD0QQNye Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_3z0b70bAwXWXdV + - req_bR8Ns6vD0QQNye Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8VKuuB1fWySn20Fo9znJ", + "id": "pi_3P8hOMKuuB1fWySn0xktqmNp", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393567, + "created": 1713871206, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8VKuuB1fWySn27KfJTAK", + "latest_charge": "ch_3P8hOMKuuB1fWySn0i4KPr2P", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8VKuuB1fWySnG6WGYjOq", + "payment_method": "pm_1P8hOLKuuB1fWySn72k0uhtc", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:28 GMT + recorded_at: Tue, 23 Apr 2024 11:20:07 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml index fad9014f664..9e09e73af29 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_eMip2uJLGOAsUL","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_ffAR0hNG0OYgX2","request_duration_ms":1124}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:17 GMT + - Tue, 23 Apr 2024 11:19:56 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 1a4570da-468a-4b3d-89fc-5e09e5f2139f + - f875e0ac-f59f-442f-aebd-f642fc83560a Original-Request: - - req_MJFLj7xyGzTDVH + - req_IEMrcHsXh2Eax0 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_MJFLj7xyGzTDVH + - req_IEMrcHsXh2Eax0 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8LKuuB1fWySnLJ1Se1NW", + "id": "pm_1P8hOCKuuB1fWySnMsprBNZg", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393557, + "created": 1713871196, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:17 GMT + recorded_at: Tue, 23 Apr 2024 11:19:56 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8LKuuB1fWySnLJ1Se1NW&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOCKuuB1fWySnMsprBNZg&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_MJFLj7xyGzTDVH","request_duration_ms":470}}' + - '{"last_request_metrics":{"request_id":"req_IEMrcHsXh2Eax0","request_duration_ms":402}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:17 GMT + - Tue, 23 Apr 2024 11:19:56 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - '091a9024-bc8e-4ae1-974b-ea8c9444cb5c' + - be163a3d-683e-4e2f-aabc-9a83fc7ec3df Original-Request: - - req_fnovB9YHqPYxKh + - req_SOQ2fhN5iPFv7u Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_fnovB9YHqPYxKh + - req_SOQ2fhN5iPFv7u Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8LKuuB1fWySn2zowFGx3", + "id": "pi_3P8hOCKuuB1fWySn1JhOQVab", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393557, + "created": 1713871196, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8LKuuB1fWySnLJ1Se1NW", + "payment_method": "pm_1P8hOCKuuB1fWySnMsprBNZg", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:17 GMT + recorded_at: Tue, 23 Apr 2024 11:19:56 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8LKuuB1fWySn2zowFGx3/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOCKuuB1fWySn1JhOQVab/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_fnovB9YHqPYxKh","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_SOQ2fhN5iPFv7u","request_duration_ms":397}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:18 GMT + - Tue, 23 Apr 2024 11:19:57 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 474e1a09-5f2b-45b0-b6ef-04074541ad2c + - f2fbde41-efcd-4895-a239-70d3f7e63854 Original-Request: - - req_C7H2INDfTs3Tjy + - req_iw9oL8XP2dNuKP Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_C7H2INDfTs3Tjy + - req_iw9oL8XP2dNuKP Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8LKuuB1fWySn2zowFGx3", + "id": "pi_3P8hOCKuuB1fWySn1JhOQVab", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393557, + "created": 1713871196, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8LKuuB1fWySn2JuiHUdy", + "latest_charge": "ch_3P8hOCKuuB1fWySn1hv7Nwzr", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8LKuuB1fWySnLJ1Se1NW", + "payment_method": "pm_1P8hOCKuuB1fWySnMsprBNZg", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:18 GMT + recorded_at: Tue, 23 Apr 2024 11:19:57 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8LKuuB1fWySn2zowFGx3 + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOCKuuB1fWySn1JhOQVab body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_C7H2INDfTs3Tjy","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_iw9oL8XP2dNuKP","request_duration_ms":918}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:19 GMT + - Tue, 23 Apr 2024 11:19:57 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_DOVGWJrVI35T4X + - req_fqNjDj939l3JjY Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8LKuuB1fWySn2zowFGx3", + "id": "pi_3P8hOCKuuB1fWySn1JhOQVab", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393557, + "created": 1713871196, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8LKuuB1fWySn2JuiHUdy", + "latest_charge": "ch_3P8hOCKuuB1fWySn1hv7Nwzr", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8LKuuB1fWySnLJ1Se1NW", + "payment_method": "pm_1P8hOCKuuB1fWySnMsprBNZg", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:19 GMT + recorded_at: Tue, 23 Apr 2024 11:19:57 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8LKuuB1fWySn2zowFGx3/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOCKuuB1fWySn1JhOQVab/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_DOVGWJrVI35T4X","request_duration_ms":407}}' + - '{"last_request_metrics":{"request_id":"req_fqNjDj939l3JjY","request_duration_ms":303}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:20 GMT + - Tue, 23 Apr 2024 11:19:58 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - d900647d-2aec-4e64-98d1-f15c83461c8f + - 8a57705c-3908-4d53-9e32-0cecb040c9fd Original-Request: - - req_PsYDkuQdjXeUiU + - req_bk7uF9eamRsrzT Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_PsYDkuQdjXeUiU + - req_bk7uF9eamRsrzT Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8LKuuB1fWySn2zowFGx3", + "id": "pi_3P8hOCKuuB1fWySn1JhOQVab", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393557, + "created": 1713871196, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8LKuuB1fWySn2JuiHUdy", + "latest_charge": "ch_3P8hOCKuuB1fWySn1hv7Nwzr", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8LKuuB1fWySnLJ1Se1NW", + "payment_method": "pm_1P8hOCKuuB1fWySnMsprBNZg", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:20 GMT + recorded_at: Tue, 23 Apr 2024 11:19:58 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8LKuuB1fWySn2zowFGx3 + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOCKuuB1fWySn1JhOQVab body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_PsYDkuQdjXeUiU","request_duration_ms":1129}}' + - '{"last_request_metrics":{"request_id":"req_bk7uF9eamRsrzT","request_duration_ms":985}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:20 GMT + - Tue, 23 Apr 2024 11:19:59 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_O9M1jcSqndJOJC + - req_hv5wGyvlDCpZ4q Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8LKuuB1fWySn2zowFGx3", + "id": "pi_3P8hOCKuuB1fWySn1JhOQVab", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393557, + "created": 1713871196, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8LKuuB1fWySn2JuiHUdy", + "latest_charge": "ch_3P8hOCKuuB1fWySn1hv7Nwzr", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8LKuuB1fWySnLJ1Se1NW", + "payment_method": "pm_1P8hOCKuuB1fWySnMsprBNZg", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:20 GMT + recorded_at: Tue, 23 Apr 2024 11:19:59 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml index 8781fce4208..03bf3d774bb 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_51gEEe58VXMvAb","request_duration_ms":464}}' + - '{"last_request_metrics":{"request_id":"req_QpAFzYIN9Npz9E","request_duration_ms":407}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:15 GMT + - Tue, 23 Apr 2024 11:19:53 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 3d62fb8d-e2d2-4a85-9cbf-db3f4eefc828 + - 89eeb309-a34b-4df4-b547-3509a1a1f2c1 Original-Request: - - req_8nJ9m62uUKZ1BT + - req_3OWdpekseC1OHc Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_8nJ9m62uUKZ1BT + - req_3OWdpekseC1OHc Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8IKuuB1fWySnR0Y3X7ef", + "id": "pm_1P8hO9KuuB1fWySnW0a4nkXb", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393554, + "created": 1713871193, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:15 GMT + recorded_at: Tue, 23 Apr 2024 11:19:53 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8IKuuB1fWySnR0Y3X7ef&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hO9KuuB1fWySnW0a4nkXb&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_8nJ9m62uUKZ1BT","request_duration_ms":572}}' + - '{"last_request_metrics":{"request_id":"req_3OWdpekseC1OHc","request_duration_ms":460}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:15 GMT + - Tue, 23 Apr 2024 11:19:54 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 91901a1a-fd2b-4876-b05c-bf94c201b9f6 + - 206fc4e9-d57b-41d7-8315-ea83924a960b Original-Request: - - req_vinBkTBwWki9qy + - req_hYzCOvueIy5BeU Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_vinBkTBwWki9qy + - req_hYzCOvueIy5BeU Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8JKuuB1fWySn2yadc0B1", + "id": "pi_3P8hOAKuuB1fWySn2WBXSlwq", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393555, + "created": 1713871194, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8IKuuB1fWySnR0Y3X7ef", + "payment_method": "pm_1P8hO9KuuB1fWySnW0a4nkXb", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:15 GMT + recorded_at: Tue, 23 Apr 2024 11:19:54 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8JKuuB1fWySn2yadc0B1/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOAKuuB1fWySn2WBXSlwq/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_vinBkTBwWki9qy","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_hYzCOvueIy5BeU","request_duration_ms":507}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:16 GMT + - Tue, 23 Apr 2024 11:19:55 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - e2fe3772-c299-4588-81a1-bdad8e9b314b + - 8be4ebdd-2a0e-471d-8065-de8dd1be088a Original-Request: - - req_eMip2uJLGOAsUL + - req_ffAR0hNG0OYgX2 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_eMip2uJLGOAsUL + - req_ffAR0hNG0OYgX2 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8JKuuB1fWySn2yadc0B1", + "id": "pi_3P8hOAKuuB1fWySn2WBXSlwq", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393555, + "created": 1713871194, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8JKuuB1fWySn26uIchSq", + "latest_charge": "ch_3P8hOAKuuB1fWySn2Uidmutm", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8IKuuB1fWySnR0Y3X7ef", + "payment_method": "pm_1P8hO9KuuB1fWySnW0a4nkXb", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:16 GMT + recorded_at: Tue, 23 Apr 2024 11:19:55 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml index ed30b7c4f38..4b204033435 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_0ok5x8RVmzx0fI","request_duration_ms":1022}}' + - '{"last_request_metrics":{"request_id":"req_F50bsJAfpjP1no","request_duration_ms":1020}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:23 GMT + - Tue, 23 Apr 2024 11:20:02 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - bdd25ab2-01bf-4d8a-b996-790be486e8f5 + - 68142e73-7169-4fd0-8d60-238cd3b2f51f Original-Request: - - req_aW2iJeMUdsXpdu + - req_W7p2bvM5ekTGhy Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_aW2iJeMUdsXpdu + - req_W7p2bvM5ekTGhy Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8RKuuB1fWySnfA4I9N8P", + "id": "pm_1P8hOHKuuB1fWySn4wnEZUnj", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393563, + "created": 1713871202, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:23 GMT + recorded_at: Tue, 23 Apr 2024 11:20:02 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8RKuuB1fWySnfA4I9N8P&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOHKuuB1fWySn4wnEZUnj&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_aW2iJeMUdsXpdu","request_duration_ms":476}}' + - '{"last_request_metrics":{"request_id":"req_W7p2bvM5ekTGhy","request_duration_ms":464}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:23 GMT + - Tue, 23 Apr 2024 11:20:02 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - f38730a5-9b88-41bb-af95-f3f0d1b6db51 + - 7895f41e-8196-4746-804f-7a476dffc8bd Original-Request: - - req_EKgkqCB3ZJn6mK + - req_EuXVMstokQQw3n Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_EKgkqCB3ZJn6mK + - req_EuXVMstokQQw3n Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8RKuuB1fWySn2f9Q1nED", + "id": "pi_3P8hOIKuuB1fWySn21HOyA6i", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393563, + "created": 1713871202, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8RKuuB1fWySnfA4I9N8P", + "payment_method": "pm_1P8hOHKuuB1fWySn4wnEZUnj", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:24 GMT + recorded_at: Tue, 23 Apr 2024 11:20:02 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8RKuuB1fWySn2f9Q1nED/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOIKuuB1fWySn21HOyA6i/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_EKgkqCB3ZJn6mK","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_EuXVMstokQQw3n","request_duration_ms":509}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:24 GMT + - Tue, 23 Apr 2024 11:20:03 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 11732f20-6777-4a68-b1a7-99963f769446 + - 38511fda-290e-4fce-a5b3-f4aee43b8b4b Original-Request: - - req_lvzjZr0RkFNeES + - req_NNPzzTeg5bGDdZ Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_lvzjZr0RkFNeES + - req_NNPzzTeg5bGDdZ Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8RKuuB1fWySn2f9Q1nED", + "id": "pi_3P8hOIKuuB1fWySn21HOyA6i", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393563, + "created": 1713871202, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8RKuuB1fWySn2G5g1Oav", + "latest_charge": "ch_3P8hOIKuuB1fWySn2LL7XqVG", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8RKuuB1fWySnfA4I9N8P", + "payment_method": "pm_1P8hOHKuuB1fWySn4wnEZUnj", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:25 GMT + recorded_at: Tue, 23 Apr 2024 11:20:03 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8RKuuB1fWySn2f9Q1nED + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOIKuuB1fWySn21HOyA6i body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_lvzjZr0RkFNeES","request_duration_ms":1022}}' + - '{"last_request_metrics":{"request_id":"req_NNPzzTeg5bGDdZ","request_duration_ms":945}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:25 GMT + - Tue, 23 Apr 2024 11:20:04 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_mZY27L2xmuWtnA + - req_uOm7zegugymQDX Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8RKuuB1fWySn2f9Q1nED", + "id": "pi_3P8hOIKuuB1fWySn21HOyA6i", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393563, + "created": 1713871202, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8RKuuB1fWySn2G5g1Oav", + "latest_charge": "ch_3P8hOIKuuB1fWySn2LL7XqVG", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8RKuuB1fWySnfA4I9N8P", + "payment_method": "pm_1P8hOHKuuB1fWySn4wnEZUnj", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:25 GMT + recorded_at: Tue, 23 Apr 2024 11:20:04 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8RKuuB1fWySn2f9Q1nED/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOIKuuB1fWySn21HOyA6i/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_mZY27L2xmuWtnA","request_duration_ms":407}}' + - '{"last_request_metrics":{"request_id":"req_uOm7zegugymQDX","request_duration_ms":379}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:26 GMT + - Tue, 23 Apr 2024 11:20:05 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - e01d3351-bd95-4c93-82f2-f68eb2c70b77 + - 2894fcfb-1365-416c-8fd0-1ee06b7bc3d7 Original-Request: - - req_eZOI1S6A1Np124 + - req_hNaSGKKhYrdaBI Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_eZOI1S6A1Np124 + - req_hNaSGKKhYrdaBI Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8RKuuB1fWySn2f9Q1nED", + "id": "pi_3P8hOIKuuB1fWySn21HOyA6i", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393563, + "created": 1713871202, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8RKuuB1fWySn2G5g1Oav", + "latest_charge": "ch_3P8hOIKuuB1fWySn2LL7XqVG", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8RKuuB1fWySnfA4I9N8P", + "payment_method": "pm_1P8hOHKuuB1fWySn4wnEZUnj", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:26 GMT + recorded_at: Tue, 23 Apr 2024 11:20:05 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8RKuuB1fWySn2f9Q1nED + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOIKuuB1fWySn21HOyA6i body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_eZOI1S6A1Np124","request_duration_ms":1125}}' + - '{"last_request_metrics":{"request_id":"req_hNaSGKKhYrdaBI","request_duration_ms":1058}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:26 GMT + - Tue, 23 Apr 2024 11:20:05 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_I3pl4WWcmSdR3t + - req_ddoELzhmVk5L54 Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8RKuuB1fWySn2f9Q1nED", + "id": "pi_3P8hOIKuuB1fWySn21HOyA6i", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393563, + "created": 1713871202, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8RKuuB1fWySn2G5g1Oav", + "latest_charge": "ch_3P8hOIKuuB1fWySn2LL7XqVG", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8RKuuB1fWySnfA4I9N8P", + "payment_method": "pm_1P8hOHKuuB1fWySn4wnEZUnj", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:26 GMT + recorded_at: Tue, 23 Apr 2024 11:20:05 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml index 41d07ffa7f1..8977ad1ddc2 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Diners_Club_14-digit_card_/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_O9M1jcSqndJOJC","request_duration_ms":401}}' + - '{"last_request_metrics":{"request_id":"req_hv5wGyvlDCpZ4q","request_duration_ms":339}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:21 GMT + - Tue, 23 Apr 2024 11:19:59 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - d26715a9-307d-47f4-a2cf-bf33c3162e70 + - 796aa49b-c388-47db-a20a-f14dfee541e2 Original-Request: - - req_XdePxbRUWKTvjI + - req_WSVbwrOSeKTiWr Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_XdePxbRUWKTvjI + - req_WSVbwrOSeKTiWr Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8PKuuB1fWySnIah9Di2G", + "id": "pm_1P8hOFKuuB1fWySn1mu7MDlw", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393561, + "created": 1713871199, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:21 GMT + recorded_at: Tue, 23 Apr 2024 11:19:59 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8PKuuB1fWySnIah9Di2G&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOFKuuB1fWySn1mu7MDlw&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_XdePxbRUWKTvjI","request_duration_ms":494}}' + - '{"last_request_metrics":{"request_id":"req_WSVbwrOSeKTiWr","request_duration_ms":463}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:21 GMT + - Tue, 23 Apr 2024 11:20:00 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - a5265d51-79c9-42f7-b184-6dbe3bd95491 + - 0dda9a0d-cf2f-4fe3-a4b9-dcfee8b3429c Original-Request: - - req_s14CejPPZfzuMk + - req_vFWYulKIEYjdV7 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_s14CejPPZfzuMk + - req_vFWYulKIEYjdV7 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8PKuuB1fWySn1OZkfwQc", + "id": "pi_3P8hOGKuuB1fWySn0s6S7d1V", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393561, + "created": 1713871200, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8PKuuB1fWySnIah9Di2G", + "payment_method": "pm_1P8hOFKuuB1fWySn1mu7MDlw", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:21 GMT + recorded_at: Tue, 23 Apr 2024 11:20:00 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8PKuuB1fWySn1OZkfwQc/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOGKuuB1fWySn0s6S7d1V/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_s14CejPPZfzuMk","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_vFWYulKIEYjdV7","request_duration_ms":496}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:22 GMT + - Tue, 23 Apr 2024 11:20:01 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - eab99991-a8d9-4da4-862a-53dba0b7e794 + - f2ba89d6-ebc3-40f2-befc-9b678db6064a Original-Request: - - req_0ok5x8RVmzx0fI + - req_F50bsJAfpjP1no Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_0ok5x8RVmzx0fI + - req_F50bsJAfpjP1no Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8PKuuB1fWySn1OZkfwQc", + "id": "pi_3P8hOGKuuB1fWySn0s6S7d1V", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393561, + "created": 1713871200, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8PKuuB1fWySn1mhyBhEE", + "latest_charge": "ch_3P8hOGKuuB1fWySn0ijMLscI", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8PKuuB1fWySnIah9Di2G", + "payment_method": "pm_1P8hOFKuuB1fWySn1mu7MDlw", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:22 GMT + recorded_at: Tue, 23 Apr 2024 11:20:01 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml index 04091ae8013..0fa5dc5ff22 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_Jro1T0jxbpxK3y","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_hUelEOGt0XpqHS","request_duration_ms":1002}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:03 GMT + - Tue, 23 Apr 2024 11:19:43 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - fddb89f6-f813-470a-9e0a-0f81b7f597c9 + - d040ffac-52c8-4b68-b2c0-35bde2a0b790 Original-Request: - - req_DSWHOaVc1vEG2s + - req_mrcp2OjDSEhD4U Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_DSWHOaVc1vEG2s + - req_mrcp2OjDSEhD4U Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h87KuuB1fWySn9X4uRzJb", + "id": "pm_1P8hNzKuuB1fWySn7MxPo4mD", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393543, + "created": 1713871183, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:03 GMT + recorded_at: Tue, 23 Apr 2024 11:19:43 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h87KuuB1fWySn9X4uRzJb&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNzKuuB1fWySn7MxPo4mD&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_DSWHOaVc1vEG2s","request_duration_ms":568}}' + - '{"last_request_metrics":{"request_id":"req_mrcp2OjDSEhD4U","request_duration_ms":434}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:04 GMT + - Tue, 23 Apr 2024 11:19:44 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - fb05d59c-5b57-4ff2-9698-8b86e8804653 + - e2f3f42f-7402-44e0-b802-f67cbee7fdd6 Original-Request: - - req_j8c27KKn1Qvu5O + - req_pJSWbZv3aRPI2J Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_j8c27KKn1Qvu5O + - req_pJSWbZv3aRPI2J Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h87KuuB1fWySn2axL111t", + "id": "pi_3P8hNzKuuB1fWySn1GYHjyQr", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393543, + "created": 1713871183, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h87KuuB1fWySn9X4uRzJb", + "payment_method": "pm_1P8hNzKuuB1fWySn7MxPo4mD", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:04 GMT + recorded_at: Tue, 23 Apr 2024 11:19:44 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h87KuuB1fWySn2axL111t/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNzKuuB1fWySn1GYHjyQr/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_j8c27KKn1Qvu5O","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_pJSWbZv3aRPI2J","request_duration_ms":523}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:05 GMT + - Tue, 23 Apr 2024 11:19:45 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 6de1b6ae-ab05-4390-9a15-b24623b2d1ab + - bba37f04-e7a0-4225-b165-91416ca762c9 Original-Request: - - req_qoa8w5ai6YeE1N + - req_r0DDvG3XCitRVS Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_qoa8w5ai6YeE1N + - req_r0DDvG3XCitRVS Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h87KuuB1fWySn2axL111t", + "id": "pi_3P8hNzKuuB1fWySn1GYHjyQr", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393543, + "created": 1713871183, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h87KuuB1fWySn2262lqw1", + "latest_charge": "ch_3P8hNzKuuB1fWySn1PWScwqp", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h87KuuB1fWySn9X4uRzJb", + "payment_method": "pm_1P8hNzKuuB1fWySn7MxPo4mD", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:05 GMT + recorded_at: Tue, 23 Apr 2024 11:19:45 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h87KuuB1fWySn2axL111t + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNzKuuB1fWySn1GYHjyQr body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_qoa8w5ai6YeE1N","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_r0DDvG3XCitRVS","request_duration_ms":912}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:05 GMT + - Tue, 23 Apr 2024 11:19:45 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_qNYhyui7rxxXIa + - req_qChjEMQoRLH3qD Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h87KuuB1fWySn2axL111t", + "id": "pi_3P8hNzKuuB1fWySn1GYHjyQr", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393543, + "created": 1713871183, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h87KuuB1fWySn2262lqw1", + "latest_charge": "ch_3P8hNzKuuB1fWySn1PWScwqp", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h87KuuB1fWySn9X4uRzJb", + "payment_method": "pm_1P8hNzKuuB1fWySn7MxPo4mD", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:05 GMT + recorded_at: Tue, 23 Apr 2024 11:19:45 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h87KuuB1fWySn2axL111t/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNzKuuB1fWySn1GYHjyQr/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_qNYhyui7rxxXIa","request_duration_ms":407}}' + - '{"last_request_metrics":{"request_id":"req_qChjEMQoRLH3qD","request_duration_ms":413}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:06 GMT + - Tue, 23 Apr 2024 11:19:46 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 9d88bb19-5593-4165-ab78-67d0c09ab47a + - 9fa89161-a992-4291-8b79-d402734179e6 Original-Request: - - req_RqO941hfsyaP41 + - req_mV2mn21SBOfoGe Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_RqO941hfsyaP41 + - req_mV2mn21SBOfoGe Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h87KuuB1fWySn2axL111t", + "id": "pi_3P8hNzKuuB1fWySn1GYHjyQr", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393543, + "created": 1713871183, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h87KuuB1fWySn2262lqw1", + "latest_charge": "ch_3P8hNzKuuB1fWySn1PWScwqp", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h87KuuB1fWySn9X4uRzJb", + "payment_method": "pm_1P8hNzKuuB1fWySn7MxPo4mD", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:06 GMT + recorded_at: Tue, 23 Apr 2024 11:19:46 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h87KuuB1fWySn2axL111t + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNzKuuB1fWySn1GYHjyQr body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_RqO941hfsyaP41","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_mV2mn21SBOfoGe","request_duration_ms":974}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:07 GMT + - Tue, 23 Apr 2024 11:19:46 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_Ig3AJuIzfGoNOE + - req_RgFOb6snLO0WMi Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h87KuuB1fWySn2axL111t", + "id": "pi_3P8hNzKuuB1fWySn1GYHjyQr", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393543, + "created": 1713871183, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h87KuuB1fWySn2262lqw1", + "latest_charge": "ch_3P8hNzKuuB1fWySn1PWScwqp", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h87KuuB1fWySn9X4uRzJb", + "payment_method": "pm_1P8hNzKuuB1fWySn7MxPo4mD", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:07 GMT + recorded_at: Tue, 23 Apr 2024 11:19:46 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml index b3ec3daf512..9063ae098ad 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_lW3Bslok4Lawnx","request_duration_ms":0}}' + - '{"last_request_metrics":{"request_id":"req_LKa5sZbf9NNCJ0","request_duration_ms":8}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:01 GMT + - Tue, 23 Apr 2024 11:19:41 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - e67d2503-043f-45aa-bc19-c5cbf2448460 + - b71c72c1-0192-47f2-9212-489aba6fd1af Original-Request: - - req_1C24OBfM43wStd + - req_mLo9zfWfizkzUY Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_1C24OBfM43wStd + - req_mLo9zfWfizkzUY Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h85KuuB1fWySnyP9ccuXz", + "id": "pm_1P8hNxKuuB1fWySnfmO4yubj", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393541, + "created": 1713871181, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:01 GMT + recorded_at: Tue, 23 Apr 2024 11:19:41 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h85KuuB1fWySnyP9ccuXz&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNxKuuB1fWySnfmO4yubj&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_1C24OBfM43wStd","request_duration_ms":724}}' + - '{"last_request_metrics":{"request_id":"req_mLo9zfWfizkzUY","request_duration_ms":533}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:01 GMT + - Tue, 23 Apr 2024 11:19:41 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 1750454d-cbef-4b4b-9948-a0a8d667c377 + - f3c1bb3f-1522-4527-8b5a-93da30ba2cda Original-Request: - - req_K1co9pzQLmxWV0 + - req_sF5Wv9QV3DwmcO Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_K1co9pzQLmxWV0 + - req_sF5Wv9QV3DwmcO Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h85KuuB1fWySn0Vn41J29", + "id": "pi_3P8hNxKuuB1fWySn01XI65KY", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393541, + "created": 1713871181, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h85KuuB1fWySnyP9ccuXz", + "payment_method": "pm_1P8hNxKuuB1fWySnfmO4yubj", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:01 GMT + recorded_at: Tue, 23 Apr 2024 11:19:42 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h85KuuB1fWySn0Vn41J29/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNxKuuB1fWySn01XI65KY/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_K1co9pzQLmxWV0","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_sF5Wv9QV3DwmcO","request_duration_ms":399}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:02 GMT + - Tue, 23 Apr 2024 11:19:42 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 69edc941-3f42-413c-b67b-34babe4bef61 + - 36247346-4c20-434b-bf06-63367b77b954 Original-Request: - - req_Jro1T0jxbpxK3y + - req_hUelEOGt0XpqHS Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_Jro1T0jxbpxK3y + - req_hUelEOGt0XpqHS Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h85KuuB1fWySn0Vn41J29", + "id": "pi_3P8hNxKuuB1fWySn01XI65KY", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393541, + "created": 1713871181, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h85KuuB1fWySn07C9hnvW", + "latest_charge": "ch_3P8hNxKuuB1fWySn0MW5J9bO", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h85KuuB1fWySnyP9ccuXz", + "payment_method": "pm_1P8hNxKuuB1fWySnfmO4yubj", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:02 GMT + recorded_at: Tue, 23 Apr 2024 11:19:43 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml index 8d8991e463a..1d72365cb64 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_wY4B9jGNDMtMfn","request_duration_ms":1025}}' + - '{"last_request_metrics":{"request_id":"req_fAlf1ANzZpDMNt","request_duration_ms":954}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:10 GMT + - Tue, 23 Apr 2024 11:19:50 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 2241cd18-8e05-445c-974e-8415a457fa84 + - ac9184bb-b326-4149-be1a-182155ad7b46 Original-Request: - - req_4IP4EqUc5hGbSe + - req_5tYNRKSrMEPncv Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_4IP4EqUc5hGbSe + - req_5tYNRKSrMEPncv Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8EKuuB1fWySnyWld9oNi", + "id": "pm_1P8hO5KuuB1fWySnqHXCiMaz", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393550, + "created": 1713871189, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:10 GMT + recorded_at: Tue, 23 Apr 2024 11:19:50 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8EKuuB1fWySnyWld9oNi&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hO5KuuB1fWySnqHXCiMaz&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_4IP4EqUc5hGbSe","request_duration_ms":475}}' + - '{"last_request_metrics":{"request_id":"req_5tYNRKSrMEPncv","request_duration_ms":421}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:11 GMT + - Tue, 23 Apr 2024 11:19:50 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 4f2f7788-7139-4924-b357-4daa3a479fa8 + - 3ee07a73-455d-4ad7-a528-350f2e02aeaa Original-Request: - - req_pv5d4X4q5cn45x + - req_WSjjJfvrG3kK4c Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_pv5d4X4q5cn45x + - req_WSjjJfvrG3kK4c Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8EKuuB1fWySn2pZzJXzz", + "id": "pi_3P8hO6KuuB1fWySn1IwrPXzP", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393550, + "created": 1713871190, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8EKuuB1fWySnyWld9oNi", + "payment_method": "pm_1P8hO5KuuB1fWySnqHXCiMaz", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:11 GMT + recorded_at: Tue, 23 Apr 2024 11:19:50 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8EKuuB1fWySn2pZzJXzz/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hO6KuuB1fWySn1IwrPXzP/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_pv5d4X4q5cn45x","request_duration_ms":578}}' + - '{"last_request_metrics":{"request_id":"req_WSjjJfvrG3kK4c","request_duration_ms":423}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:12 GMT + - Tue, 23 Apr 2024 11:19:51 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - fee95263-7a25-4762-8fe4-86e1a87bbfe9 + - d02cccc9-34d6-4c71-a4a6-b0bd477f1ba7 Original-Request: - - req_YP4sNK7buFgJiP + - req_MO4YL2nMwG7MXK Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_YP4sNK7buFgJiP + - req_MO4YL2nMwG7MXK Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8EKuuB1fWySn2pZzJXzz", + "id": "pi_3P8hO6KuuB1fWySn1IwrPXzP", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393550, + "created": 1713871190, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8EKuuB1fWySn24dbBR1i", + "latest_charge": "ch_3P8hO6KuuB1fWySn1ig8dB77", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8EKuuB1fWySnyWld9oNi", + "payment_method": "pm_1P8hO5KuuB1fWySnqHXCiMaz", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:12 GMT + recorded_at: Tue, 23 Apr 2024 11:19:51 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8EKuuB1fWySn2pZzJXzz + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hO6KuuB1fWySn1IwrPXzP body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_YP4sNK7buFgJiP","request_duration_ms":1226}}' + - '{"last_request_metrics":{"request_id":"req_MO4YL2nMwG7MXK","request_duration_ms":919}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:12 GMT + - Tue, 23 Apr 2024 11:19:51 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_tM97ZW0ucJ8jxO + - req_g7XHae1FaSx5Ba Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8EKuuB1fWySn2pZzJXzz", + "id": "pi_3P8hO6KuuB1fWySn1IwrPXzP", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393550, + "created": 1713871190, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8EKuuB1fWySn24dbBR1i", + "latest_charge": "ch_3P8hO6KuuB1fWySn1ig8dB77", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8EKuuB1fWySnyWld9oNi", + "payment_method": "pm_1P8hO5KuuB1fWySnqHXCiMaz", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:12 GMT + recorded_at: Tue, 23 Apr 2024 11:19:51 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8EKuuB1fWySn2pZzJXzz/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hO6KuuB1fWySn1IwrPXzP/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_tM97ZW0ucJ8jxO","request_duration_ms":407}}' + - '{"last_request_metrics":{"request_id":"req_g7XHae1FaSx5Ba","request_duration_ms":407}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:14 GMT + - Tue, 23 Apr 2024 11:19:52 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - a04cd255-ba11-4624-a52a-555c3b4fc020 + - 0c4e5c8b-a2b5-47ba-836b-ed85e2cf82a7 Original-Request: - - req_Sy7n2RgT7nbSAm + - req_cCJKr1t50pPyIF Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_Sy7n2RgT7nbSAm + - req_cCJKr1t50pPyIF Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8EKuuB1fWySn2pZzJXzz", + "id": "pi_3P8hO6KuuB1fWySn1IwrPXzP", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393550, + "created": 1713871190, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8EKuuB1fWySn24dbBR1i", + "latest_charge": "ch_3P8hO6KuuB1fWySn1ig8dB77", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8EKuuB1fWySnyWld9oNi", + "payment_method": "pm_1P8hO5KuuB1fWySnqHXCiMaz", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:14 GMT + recorded_at: Tue, 23 Apr 2024 11:19:53 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8EKuuB1fWySn2pZzJXzz + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hO6KuuB1fWySn1IwrPXzP body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_Sy7n2RgT7nbSAm","request_duration_ms":1168}}' + - '{"last_request_metrics":{"request_id":"req_cCJKr1t50pPyIF","request_duration_ms":1224}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:14 GMT + - Tue, 23 Apr 2024 11:19:53 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_51gEEe58VXMvAb + - req_QpAFzYIN9Npz9E Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8EKuuB1fWySn2pZzJXzz", + "id": "pi_3P8hO6KuuB1fWySn1IwrPXzP", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393550, + "created": 1713871190, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8EKuuB1fWySn24dbBR1i", + "latest_charge": "ch_3P8hO6KuuB1fWySn1ig8dB77", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8EKuuB1fWySnyWld9oNi", + "payment_method": "pm_1P8hO5KuuB1fWySnqHXCiMaz", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:14 GMT + recorded_at: Tue, 23 Apr 2024 11:19:53 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/returns_payment_intent_id_and_does_not_raise.yml index 19a441486e1..7ec3b2a5e7c 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Discover_debit_/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_Ig3AJuIzfGoNOE","request_duration_ms":0}}' + - '{"last_request_metrics":{"request_id":"req_RgFOb6snLO0WMi","request_duration_ms":2}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:08 GMT + - Tue, 23 Apr 2024 11:19:47 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - a3d1e9b9-1762-4194-aa0f-bcfa32002963 + - 9e2abb26-3297-4c73-990f-757e2674d462 Original-Request: - - req_JiR92vYhr5TM50 + - req_tf2Rs1eihoUNxK Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_JiR92vYhr5TM50 + - req_tf2Rs1eihoUNxK Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8CKuuB1fWySnn2XdeHK9", + "id": "pm_1P8hO3KuuB1fWySnY7BZKiff", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393548, + "created": 1713871187, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:08 GMT + recorded_at: Tue, 23 Apr 2024 11:19:47 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8CKuuB1fWySnn2XdeHK9&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hO3KuuB1fWySnY7BZKiff&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_JiR92vYhr5TM50","request_duration_ms":649}}' + - '{"last_request_metrics":{"request_id":"req_tf2Rs1eihoUNxK","request_duration_ms":611}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:08 GMT + - Tue, 23 Apr 2024 11:19:48 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 9853ac76-700d-4823-90b5-5d52fc9d8635 + - 368b0e6c-ff08-450c-a7e2-c4c66563bb17 Original-Request: - - req_8jGk89mm1ODvyk + - req_3p5Z7xay6hP4RH Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_8jGk89mm1ODvyk + - req_3p5Z7xay6hP4RH Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8CKuuB1fWySn10MMn2hm", + "id": "pi_3P8hO3KuuB1fWySn1HOnd9p1", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393548, + "created": 1713871187, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8CKuuB1fWySnn2XdeHK9", + "payment_method": "pm_1P8hO3KuuB1fWySnY7BZKiff", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:09 GMT + recorded_at: Tue, 23 Apr 2024 11:19:48 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8CKuuB1fWySn10MMn2hm/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hO3KuuB1fWySn1HOnd9p1/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_8jGk89mm1ODvyk","request_duration_ms":511}}' + - '{"last_request_metrics":{"request_id":"req_3p5Z7xay6hP4RH","request_duration_ms":406}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:10 GMT + - Tue, 23 Apr 2024 11:19:49 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 6a66637e-54e0-4fc5-ac45-3720f80d9700 + - 5e3cd5fe-4bc1-478c-ad1b-24eb5f4be301 Original-Request: - - req_wY4B9jGNDMtMfn + - req_fAlf1ANzZpDMNt Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_wY4B9jGNDMtMfn + - req_fAlf1ANzZpDMNt Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8CKuuB1fWySn10MMn2hm", + "id": "pi_3P8hO3KuuB1fWySn1HOnd9p1", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393548, + "created": 1713871187, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8CKuuB1fWySn129qcNTE", + "latest_charge": "ch_3P8hO3KuuB1fWySn1899AcR4", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8CKuuB1fWySnn2XdeHK9", + "payment_method": "pm_1P8hO3KuuB1fWySnY7BZKiff", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:10 GMT + recorded_at: Tue, 23 Apr 2024 11:19:49 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/captures_the_payment.yml index 27961575161..885412ee9f5 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_XU3WFVYNTliEXC","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_kl1l8tZ8m0kbDf","request_duration_ms":1002}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:35 GMT + - Tue, 23 Apr 2024 11:20:13 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 357da29a-e2b7-43cc-bd9e-161b9d520bdc + - a40dc133-7ca3-4b09-8e6f-e8c61d370584 Original-Request: - - req_7UNFeEXr46vI6L + - req_mUyu5seUEEfMGE Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_7UNFeEXr46vI6L + - req_mUyu5seUEEfMGE Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8dKuuB1fWySnhCOEVBGj", + "id": "pm_1P8hOTKuuB1fWySnkItqUgEU", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393575, + "created": 1713871213, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:35 GMT + recorded_at: Tue, 23 Apr 2024 11:20:14 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8dKuuB1fWySnhCOEVBGj&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOTKuuB1fWySnkItqUgEU&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_7UNFeEXr46vI6L","request_duration_ms":548}}' + - '{"last_request_metrics":{"request_id":"req_mUyu5seUEEfMGE","request_duration_ms":455}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:36 GMT + - Tue, 23 Apr 2024 11:20:14 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 4bdc362a-568f-46e0-8bf5-ead8998c4194 + - 1cb2b91a-4dc4-4046-93fa-8c875120ee62 Original-Request: - - req_rRa1jvM4JlQWMg + - req_axYjMwHkPhMAM7 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_rRa1jvM4JlQWMg + - req_axYjMwHkPhMAM7 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8eKuuB1fWySn1b9CxAKe", + "id": "pi_3P8hOUKuuB1fWySn0OCzn8IF", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393576, + "created": 1713871214, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8dKuuB1fWySnhCOEVBGj", + "payment_method": "pm_1P8hOTKuuB1fWySnkItqUgEU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:36 GMT + recorded_at: Tue, 23 Apr 2024 11:20:14 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8eKuuB1fWySn1b9CxAKe/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOUKuuB1fWySn0OCzn8IF/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_rRa1jvM4JlQWMg","request_duration_ms":510}}' + - '{"last_request_metrics":{"request_id":"req_axYjMwHkPhMAM7","request_duration_ms":388}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:37 GMT + - Tue, 23 Apr 2024 11:20:15 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - a9d0ea38-5bed-4c67-a252-966681874216 + - ac7c0a58-37d5-425c-8b04-b043f2855864 Original-Request: - - req_ENWSMHqZcGMWpK + - req_TuBek7AQPiM0nt Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_ENWSMHqZcGMWpK + - req_TuBek7AQPiM0nt Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8eKuuB1fWySn1b9CxAKe", + "id": "pi_3P8hOUKuuB1fWySn0OCzn8IF", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393576, + "created": 1713871214, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8eKuuB1fWySn1YNttyDS", + "latest_charge": "ch_3P8hOUKuuB1fWySn0xp8MWNk", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8dKuuB1fWySnhCOEVBGj", + "payment_method": "pm_1P8hOTKuuB1fWySnkItqUgEU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:37 GMT + recorded_at: Tue, 23 Apr 2024 11:20:15 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8eKuuB1fWySn1b9CxAKe + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOUKuuB1fWySn0OCzn8IF body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_ENWSMHqZcGMWpK","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_TuBek7AQPiM0nt","request_duration_ms":976}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:37 GMT + - Tue, 23 Apr 2024 11:20:15 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_gZ7FYVaBhGNqpm + - req_kdelbdfbggTPaa Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8eKuuB1fWySn1b9CxAKe", + "id": "pi_3P8hOUKuuB1fWySn0OCzn8IF", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393576, + "created": 1713871214, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8eKuuB1fWySn1YNttyDS", + "latest_charge": "ch_3P8hOUKuuB1fWySn0xp8MWNk", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8dKuuB1fWySnhCOEVBGj", + "payment_method": "pm_1P8hOTKuuB1fWySnkItqUgEU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:37 GMT + recorded_at: Tue, 23 Apr 2024 11:20:15 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8eKuuB1fWySn1b9CxAKe/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOUKuuB1fWySn0OCzn8IF/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_gZ7FYVaBhGNqpm","request_duration_ms":406}}' + - '{"last_request_metrics":{"request_id":"req_kdelbdfbggTPaa","request_duration_ms":407}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:38 GMT + - Tue, 23 Apr 2024 11:20:16 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 285699b9-4dbc-4957-9c63-1e566b6cc8ee + - 0673b866-665c-491c-bc27-21aa00e8f09d Original-Request: - - req_x019kO3n2Z4x3w + - req_GpEipF4MI3yx0T Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_x019kO3n2Z4x3w + - req_GpEipF4MI3yx0T Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8eKuuB1fWySn1b9CxAKe", + "id": "pi_3P8hOUKuuB1fWySn0OCzn8IF", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393576, + "created": 1713871214, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8eKuuB1fWySn1YNttyDS", + "latest_charge": "ch_3P8hOUKuuB1fWySn0xp8MWNk", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8dKuuB1fWySnhCOEVBGj", + "payment_method": "pm_1P8hOTKuuB1fWySnkItqUgEU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:38 GMT + recorded_at: Tue, 23 Apr 2024 11:20:16 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8eKuuB1fWySn1b9CxAKe + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOUKuuB1fWySn0OCzn8IF body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_x019kO3n2Z4x3w","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_GpEipF4MI3yx0T","request_duration_ms":1009}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:39 GMT + - Tue, 23 Apr 2024 11:20:17 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_e3is6LFByX27Sh + - req_aZYwq636amcQQc Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8eKuuB1fWySn1b9CxAKe", + "id": "pi_3P8hOUKuuB1fWySn0OCzn8IF", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393576, + "created": 1713871214, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8eKuuB1fWySn1YNttyDS", + "latest_charge": "ch_3P8hOUKuuB1fWySn0xp8MWNk", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8dKuuB1fWySnhCOEVBGj", + "payment_method": "pm_1P8hOTKuuB1fWySnkItqUgEU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:39 GMT + recorded_at: Tue, 23 Apr 2024 11:20:17 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/returns_payment_intent_id_and_does_not_raise.yml index a8f2b95f222..41e3981b408 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_JCB/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_hfwFTTxVfnyp1F","request_duration_ms":407}}' + - '{"last_request_metrics":{"request_id":"req_JAV7p6VHbcflfL","request_duration_ms":363}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:33 GMT + - Tue, 23 Apr 2024 11:20:11 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - ec6ae87e-5372-4823-a3c1-048be735cbe9 + - 96c811e1-f032-4603-83f7-ddfe1ba57f16 Original-Request: - - req_o3NQREyRyHqUeQ + - req_gN71qbyBhbSCaV Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_o3NQREyRyHqUeQ + - req_gN71qbyBhbSCaV Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8bKuuB1fWySnV3EVs9rr", + "id": "pm_1P8hORKuuB1fWySnpgvVFNXR", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393573, + "created": 1713871211, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:33 GMT + recorded_at: Tue, 23 Apr 2024 11:20:11 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8bKuuB1fWySnV3EVs9rr&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hORKuuB1fWySnpgvVFNXR&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_o3NQREyRyHqUeQ","request_duration_ms":470}}' + - '{"last_request_metrics":{"request_id":"req_gN71qbyBhbSCaV","request_duration_ms":460}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:33 GMT + - Tue, 23 Apr 2024 11:20:12 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 7d15d187-e69f-4492-a8e7-5ab0af825e8f + - dbb3f060-b47b-40c3-9f4b-110c01f5dd82 Original-Request: - - req_5XJ8dCbnt9VCWt + - req_l0GRMW8ha1y6ZY Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_5XJ8dCbnt9VCWt + - req_l0GRMW8ha1y6ZY Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8bKuuB1fWySn2iWXlsFV", + "id": "pi_3P8hOSKuuB1fWySn0jMpjzSN", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393573, + "created": 1713871212, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8bKuuB1fWySnV3EVs9rr", + "payment_method": "pm_1P8hORKuuB1fWySnpgvVFNXR", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:34 GMT + recorded_at: Tue, 23 Apr 2024 11:20:12 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8bKuuB1fWySn2iWXlsFV/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOSKuuB1fWySn0jMpjzSN/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_5XJ8dCbnt9VCWt","request_duration_ms":510}}' + - '{"last_request_metrics":{"request_id":"req_l0GRMW8ha1y6ZY","request_duration_ms":409}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:34 GMT + - Tue, 23 Apr 2024 11:20:13 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - b3de6aaa-c28c-4574-bed6-bf885213bcc1 + - 35a65fd7-95f6-4d2b-a295-4b3a9e2c0881 Original-Request: - - req_XU3WFVYNTliEXC + - req_kl1l8tZ8m0kbDf Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_XU3WFVYNTliEXC + - req_kl1l8tZ8m0kbDf Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8bKuuB1fWySn2iWXlsFV", + "id": "pi_3P8hOSKuuB1fWySn0jMpjzSN", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393573, + "created": 1713871212, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8bKuuB1fWySn2ZYaHWqC", + "latest_charge": "ch_3P8hOSKuuB1fWySn0eEJgg3W", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8bKuuB1fWySnV3EVs9rr", + "payment_method": "pm_1P8hORKuuB1fWySnpgvVFNXR", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:35 GMT + recorded_at: Tue, 23 Apr 2024 11:20:13 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/captures_the_payment.yml index f815907d417..432ee72102a 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_g8fpJ3tSDgxYPQ","request_duration_ms":1020}}' + - '{"last_request_metrics":{"request_id":"req_eIInMRZ1eXZU41","request_duration_ms":1016}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:31 GMT + - Tue, 23 Apr 2024 11:19:13 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - e21b93d0-027e-44c7-98c8-ea1baa84af7f + - 5ceec80c-a100-460a-8a03-84ed8bb7f5c0 Original-Request: - - req_OzvqmGMnvaWaBl + - req_jqcXi4NJ8WV0n4 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_OzvqmGMnvaWaBl + - req_jqcXi4NJ8WV0n4 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7bKuuB1fWySnmKTufvU0", + "id": "pm_1P8hNVKuuB1fWySnVxlVNCjV", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393511, + "created": 1713871153, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:32 GMT + recorded_at: Tue, 23 Apr 2024 11:19:13 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7bKuuB1fWySnmKTufvU0&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNVKuuB1fWySnVxlVNCjV&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_OzvqmGMnvaWaBl","request_duration_ms":560}}' + - '{"last_request_metrics":{"request_id":"req_jqcXi4NJ8WV0n4","request_duration_ms":479}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:32 GMT + - Tue, 23 Apr 2024 11:19:13 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 4a1f364f-085d-4591-8d13-696b5b052464 + - 220209d4-9049-4517-af7c-08490432ee4d Original-Request: - - req_5I1uIn6AbfwyeA + - req_sPHq2BjlP1unjJ Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_5I1uIn6AbfwyeA + - req_sPHq2BjlP1unjJ Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7cKuuB1fWySn2TjKl4Mh", + "id": "pi_3P8hNVKuuB1fWySn1DL7rhUi", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393512, + "created": 1713871153, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7bKuuB1fWySnmKTufvU0", + "payment_method": "pm_1P8hNVKuuB1fWySnVxlVNCjV", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:32 GMT + recorded_at: Tue, 23 Apr 2024 11:19:14 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7cKuuB1fWySn2TjKl4Mh/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNVKuuB1fWySn1DL7rhUi/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_5I1uIn6AbfwyeA","request_duration_ms":508}}' + - '{"last_request_metrics":{"request_id":"req_sPHq2BjlP1unjJ","request_duration_ms":383}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:33 GMT + - Tue, 23 Apr 2024 11:19:14 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 6711bdc3-7014-4a10-92c5-4e6297b59d90 + - 71122f42-4394-4b01-8772-9969cdbed905 Original-Request: - - req_qGBXUK9Cyg5bMl + - req_QOY3UnPSJbztPn Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_qGBXUK9Cyg5bMl + - req_QOY3UnPSJbztPn Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7cKuuB1fWySn2TjKl4Mh", + "id": "pi_3P8hNVKuuB1fWySn1DL7rhUi", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393512, + "created": 1713871153, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7cKuuB1fWySn2UMZdoWi", + "latest_charge": "ch_3P8hNVKuuB1fWySn1qxnZG1M", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7bKuuB1fWySnmKTufvU0", + "payment_method": "pm_1P8hNVKuuB1fWySnVxlVNCjV", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:33 GMT + recorded_at: Tue, 23 Apr 2024 11:19:15 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7cKuuB1fWySn2TjKl4Mh + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNVKuuB1fWySn1DL7rhUi body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_qGBXUK9Cyg5bMl","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_QOY3UnPSJbztPn","request_duration_ms":1039}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:33 GMT + - Tue, 23 Apr 2024 11:19:15 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_c0GSQTvUz0RucZ + - req_wl40jfIqsJltcH Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7cKuuB1fWySn2TjKl4Mh", + "id": "pi_3P8hNVKuuB1fWySn1DL7rhUi", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393512, + "created": 1713871153, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7cKuuB1fWySn2UMZdoWi", + "latest_charge": "ch_3P8hNVKuuB1fWySn1qxnZG1M", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7bKuuB1fWySnmKTufvU0", + "payment_method": "pm_1P8hNVKuuB1fWySnVxlVNCjV", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:33 GMT + recorded_at: Tue, 23 Apr 2024 11:19:15 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7cKuuB1fWySn2TjKl4Mh/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNVKuuB1fWySn1DL7rhUi/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_c0GSQTvUz0RucZ","request_duration_ms":406}}' + - '{"last_request_metrics":{"request_id":"req_wl40jfIqsJltcH","request_duration_ms":406}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:34 GMT + - Tue, 23 Apr 2024 11:19:16 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 199b836c-b997-4ce4-a40d-41f209ab3e9b + - 83d55169-9ec4-41ae-8f7d-5a54fea71870 Original-Request: - - req_qxbgYtm9mjH1jt + - req_wB5IUmdP1EYXMA Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_qxbgYtm9mjH1jt + - req_wB5IUmdP1EYXMA Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7cKuuB1fWySn2TjKl4Mh", + "id": "pi_3P8hNVKuuB1fWySn1DL7rhUi", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393512, + "created": 1713871153, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7cKuuB1fWySn2UMZdoWi", + "latest_charge": "ch_3P8hNVKuuB1fWySn1qxnZG1M", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7bKuuB1fWySnmKTufvU0", + "payment_method": "pm_1P8hNVKuuB1fWySnVxlVNCjV", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:35 GMT + recorded_at: Tue, 23 Apr 2024 11:19:16 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7cKuuB1fWySn2TjKl4Mh + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNVKuuB1fWySn1DL7rhUi body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_qxbgYtm9mjH1jt","request_duration_ms":1056}}' + - '{"last_request_metrics":{"request_id":"req_wB5IUmdP1EYXMA","request_duration_ms":1020}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:35 GMT + - Tue, 23 Apr 2024 11:19:16 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_1TBVTn0lfprC7a + - req_SSRtzR6wWky9D6 Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7cKuuB1fWySn2TjKl4Mh", + "id": "pi_3P8hNVKuuB1fWySn1DL7rhUi", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393512, + "created": 1713871153, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7cKuuB1fWySn2UMZdoWi", + "latest_charge": "ch_3P8hNVKuuB1fWySn1qxnZG1M", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7bKuuB1fWySnmKTufvU0", + "payment_method": "pm_1P8hNVKuuB1fWySnVxlVNCjV", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:35 GMT + recorded_at: Tue, 23 Apr 2024 11:19:16 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/returns_payment_intent_id_and_does_not_raise.yml index 956a3491aaa..b2dbf14ea24 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_VCkHzjjHMXrfND","request_duration_ms":405}}' + - '{"last_request_metrics":{"request_id":"req_nTq52MOanuOx3G","request_duration_ms":414}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:29 GMT + - Tue, 23 Apr 2024 11:19:11 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 637171ff-19eb-48b9-8401-d23a8f9e5214 + - 7976a805-223e-4e5b-a59c-55d0a6fc3e75 Original-Request: - - req_McZwC6YjxsbAEP + - req_Ca4xWT8rQNwZH1 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_McZwC6YjxsbAEP + - req_Ca4xWT8rQNwZH1 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7ZKuuB1fWySnxHBASqdf", + "id": "pm_1P8hNSKuuB1fWySn4dpMW2My", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393509, + "created": 1713871151, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:29 GMT + recorded_at: Tue, 23 Apr 2024 11:19:11 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7ZKuuB1fWySnxHBASqdf&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNSKuuB1fWySn4dpMW2My&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_McZwC6YjxsbAEP","request_duration_ms":493}}' + - '{"last_request_metrics":{"request_id":"req_Ca4xWT8rQNwZH1","request_duration_ms":467}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:30 GMT + - Tue, 23 Apr 2024 11:19:11 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 5a404a67-bdd7-4648-bbf3-e6fa3647c924 + - 4acd1a5c-2904-4cef-a24c-df22988652af Original-Request: - - req_NgaDMPUptcH1lw + - req_wv6lC78dnzLGrQ Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_NgaDMPUptcH1lw + - req_wv6lC78dnzLGrQ Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7ZKuuB1fWySn0Epjo3Ys", + "id": "pi_3P8hNTKuuB1fWySn19SCwgTp", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393509, + "created": 1713871151, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7ZKuuB1fWySnxHBASqdf", + "payment_method": "pm_1P8hNSKuuB1fWySn4dpMW2My", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:30 GMT + recorded_at: Tue, 23 Apr 2024 11:19:11 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7ZKuuB1fWySn0Epjo3Ys/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNTKuuB1fWySn19SCwgTp/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_NgaDMPUptcH1lw","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_wv6lC78dnzLGrQ","request_duration_ms":412}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:31 GMT + - Tue, 23 Apr 2024 11:19:12 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - ddbf9dc3-4691-49dd-82d6-15ce020d7ac7 + - b6253b97-24c3-4f95-9d90-8448b0354929 Original-Request: - - req_g8fpJ3tSDgxYPQ + - req_eIInMRZ1eXZU41 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_g8fpJ3tSDgxYPQ + - req_eIInMRZ1eXZU41 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7ZKuuB1fWySn0Epjo3Ys", + "id": "pi_3P8hNTKuuB1fWySn19SCwgTp", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393509, + "created": 1713871151, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7ZKuuB1fWySn09Ti3WUV", + "latest_charge": "ch_3P8hNTKuuB1fWySn1Lmu3kRA", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7ZKuuB1fWySnxHBASqdf", + "payment_method": "pm_1P8hNSKuuB1fWySn4dpMW2My", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:31 GMT + recorded_at: Tue, 23 Apr 2024 11:19:12 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/captures_the_payment.yml index 90cd0b7c64d..56990a50129 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_Baoct8gPfc5IXe","request_duration_ms":1124}}' + - '{"last_request_metrics":{"request_id":"req_ygkJQozQtkURDT","request_duration_ms":1018}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:38 GMT + - Tue, 23 Apr 2024 11:19:19 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 155ba9ef-7af4-4b55-a1b0-b28a42a43a4a + - cb6e26f7-2bd0-4ccf-9375-bbb5ad649a41 Original-Request: - - req_aitA9tdDrHSICN + - req_IPdDMbOxGLlNqg Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_aitA9tdDrHSICN + - req_IPdDMbOxGLlNqg Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7iKuuB1fWySnJyTtWbWH", + "id": "pm_1P8hNbKuuB1fWySnuDwN50nq", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393518, + "created": 1713871159, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:38 GMT + recorded_at: Tue, 23 Apr 2024 11:19:19 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7iKuuB1fWySnJyTtWbWH&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNbKuuB1fWySnuDwN50nq&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_aitA9tdDrHSICN","request_duration_ms":460}}' + - '{"last_request_metrics":{"request_id":"req_IPdDMbOxGLlNqg","request_duration_ms":474}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:38 GMT + - Tue, 23 Apr 2024 11:19:20 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 5984f7d2-a8b3-4223-86db-64603fb29ca5 + - 3ec55a49-5395-43d0-bc83-7227bba04153 Original-Request: - - req_AYqcfGX1gF01Lp + - req_c9usRMhk51o6Ac Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_AYqcfGX1gF01Lp + - req_c9usRMhk51o6Ac Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7iKuuB1fWySn085HPtaw", + "id": "pi_3P8hNbKuuB1fWySn16kVbAJ6", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393518, + "created": 1713871159, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7iKuuB1fWySnJyTtWbWH", + "payment_method": "pm_1P8hNbKuuB1fWySnuDwN50nq", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:39 GMT + recorded_at: Tue, 23 Apr 2024 11:19:20 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7iKuuB1fWySn085HPtaw/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNbKuuB1fWySn16kVbAJ6/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_AYqcfGX1gF01Lp","request_duration_ms":508}}' + - '{"last_request_metrics":{"request_id":"req_c9usRMhk51o6Ac","request_duration_ms":413}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:40 GMT + - Tue, 23 Apr 2024 11:19:20 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - c4e41b64-9dbb-4b18-9126-05c223d27f1b + - 21e61612-80e3-4284-b8a5-acd4ab9d3441 Original-Request: - - req_tN8OhC5SoBlYkK + - req_DbJHhKNFUljKyc Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_tN8OhC5SoBlYkK + - req_DbJHhKNFUljKyc Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7iKuuB1fWySn085HPtaw", + "id": "pi_3P8hNbKuuB1fWySn16kVbAJ6", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393518, + "created": 1713871159, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7iKuuB1fWySn0z4PW3rG", + "latest_charge": "ch_3P8hNbKuuB1fWySn1BvV6OsL", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7iKuuB1fWySnJyTtWbWH", + "payment_method": "pm_1P8hNbKuuB1fWySnuDwN50nq", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:40 GMT + recorded_at: Tue, 23 Apr 2024 11:19:21 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7iKuuB1fWySn085HPtaw + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNbKuuB1fWySn16kVbAJ6 body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_tN8OhC5SoBlYkK","request_duration_ms":996}}' + - '{"last_request_metrics":{"request_id":"req_DbJHhKNFUljKyc","request_duration_ms":1013}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:40 GMT + - Tue, 23 Apr 2024 11:19:21 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_hYHnMmN9ZeEqzM + - req_gWXHq55AgDqueS Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7iKuuB1fWySn085HPtaw", + "id": "pi_3P8hNbKuuB1fWySn16kVbAJ6", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393518, + "created": 1713871159, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7iKuuB1fWySn0z4PW3rG", + "latest_charge": "ch_3P8hNbKuuB1fWySn1BvV6OsL", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7iKuuB1fWySnJyTtWbWH", + "payment_method": "pm_1P8hNbKuuB1fWySnuDwN50nq", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:40 GMT + recorded_at: Tue, 23 Apr 2024 11:19:21 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7iKuuB1fWySn085HPtaw/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNbKuuB1fWySn16kVbAJ6/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_hYHnMmN9ZeEqzM","request_duration_ms":433}}' + - '{"last_request_metrics":{"request_id":"req_gWXHq55AgDqueS","request_duration_ms":305}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:41 GMT + - Tue, 23 Apr 2024 11:19:22 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - fae3960c-ce41-4337-ba82-f2c6b537376d + - e7389e27-8f99-48f2-9032-e4c8d02fe66d Original-Request: - - req_fjJzgMgYlPR4DL + - req_6CfV62JgOuhgli Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_fjJzgMgYlPR4DL + - req_6CfV62JgOuhgli Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7iKuuB1fWySn085HPtaw", + "id": "pi_3P8hNbKuuB1fWySn16kVbAJ6", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393518, + "created": 1713871159, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7iKuuB1fWySn0z4PW3rG", + "latest_charge": "ch_3P8hNbKuuB1fWySn1BvV6OsL", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7iKuuB1fWySnJyTtWbWH", + "payment_method": "pm_1P8hNbKuuB1fWySnuDwN50nq", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:41 GMT + recorded_at: Tue, 23 Apr 2024 11:19:22 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7iKuuB1fWySn085HPtaw + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNbKuuB1fWySn16kVbAJ6 body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_fjJzgMgYlPR4DL","request_duration_ms":1022}}' + - '{"last_request_metrics":{"request_id":"req_6CfV62JgOuhgli","request_duration_ms":1020}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:41 GMT + - Tue, 23 Apr 2024 11:19:22 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_0gpLm2PRfuTefq + - req_mRbMJOdTu3yIY8 Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7iKuuB1fWySn085HPtaw", + "id": "pi_3P8hNbKuuB1fWySn16kVbAJ6", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393518, + "created": 1713871159, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7iKuuB1fWySn0z4PW3rG", + "latest_charge": "ch_3P8hNbKuuB1fWySn1BvV6OsL", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7iKuuB1fWySnJyTtWbWH", + "payment_method": "pm_1P8hNbKuuB1fWySnuDwN50nq", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:41 GMT + recorded_at: Tue, 23 Apr 2024 11:19:22 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/returns_payment_intent_id_and_does_not_raise.yml index 5f0eba6cd9b..8e1542d6002 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_2-series_/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_1TBVTn0lfprC7a","request_duration_ms":372}}' + - '{"last_request_metrics":{"request_id":"req_SSRtzR6wWky9D6","request_duration_ms":304}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:35 GMT + - Tue, 23 Apr 2024 11:19:17 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 58b3dc0d-d859-4aec-ad64-81fd829057f5 + - 8b37c4cf-b4a8-43dc-ac9b-324061ceaa48 Original-Request: - - req_TVHZ0jBYHD52eU + - req_cW83qnxUvfANtm Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_TVHZ0jBYHD52eU + - req_cW83qnxUvfANtm Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7fKuuB1fWySnznMVKuJP", + "id": "pm_1P8hNZKuuB1fWySnl5x9fTeS", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393515, + "created": 1713871157, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:35 GMT + recorded_at: Tue, 23 Apr 2024 11:19:17 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7fKuuB1fWySnznMVKuJP&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNZKuuB1fWySnl5x9fTeS&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_TVHZ0jBYHD52eU","request_duration_ms":573}}' + - '{"last_request_metrics":{"request_id":"req_cW83qnxUvfANtm","request_duration_ms":413}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:36 GMT + - Tue, 23 Apr 2024 11:19:17 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 88b2ff41-8267-4e23-976e-14bef7f4dec3 + - 24dae735-2012-459e-bade-fc441ffb277f Original-Request: - - req_9lxpOGazNVrrTb + - req_Gtx8Vh5lqpsfIB Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_9lxpOGazNVrrTb + - req_Gtx8Vh5lqpsfIB Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7gKuuB1fWySn1X1xIIbG", + "id": "pi_3P8hNZKuuB1fWySn0YrMo2ze", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393516, + "created": 1713871157, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7fKuuB1fWySnznMVKuJP", + "payment_method": "pm_1P8hNZKuuB1fWySnl5x9fTeS", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:36 GMT + recorded_at: Tue, 23 Apr 2024 11:19:17 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7gKuuB1fWySn1X1xIIbG/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNZKuuB1fWySn0YrMo2ze/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_9lxpOGazNVrrTb","request_duration_ms":815}}' + - '{"last_request_metrics":{"request_id":"req_Gtx8Vh5lqpsfIB","request_duration_ms":454}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:37 GMT + - Tue, 23 Apr 2024 11:19:18 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - a577ba88-3c2d-4ba6-8a69-812963a05746 + - c38a9c4c-a01d-4e8f-b1d8-95861b8b364a Original-Request: - - req_Baoct8gPfc5IXe + - req_ygkJQozQtkURDT Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_Baoct8gPfc5IXe + - req_ygkJQozQtkURDT Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7gKuuB1fWySn1X1xIIbG", + "id": "pi_3P8hNZKuuB1fWySn0YrMo2ze", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393516, + "created": 1713871157, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7gKuuB1fWySn1yt01OWS", + "latest_charge": "ch_3P8hNZKuuB1fWySn0gAo8fu2", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7fKuuB1fWySnznMVKuJP", + "payment_method": "pm_1P8hNZKuuB1fWySnl5x9fTeS", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:37 GMT + recorded_at: Tue, 23 Apr 2024 11:19:18 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/captures_the_payment.yml index 41427c758be..52d93bbd9c7 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_u0ATTx9OcSqYEk","request_duration_ms":1023}}' + - '{"last_request_metrics":{"request_id":"req_vGSuRwCcR1RyAj","request_duration_ms":1021}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:44 GMT + - Tue, 23 Apr 2024 11:19:25 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - ea370f42-3dc3-4315-af92-6232ea741f11 + - 82d1cd6f-2d19-4acd-9459-53e42b796785 Original-Request: - - req_z2IxgLmQP4XsOi + - req_v9WiVetN61i25Q Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_z2IxgLmQP4XsOi + - req_v9WiVetN61i25Q Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7oKuuB1fWySnyFTNOWm1", + "id": "pm_1P8hNhKuuB1fWySn8sb4JhFU", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393524, + "created": 1713871165, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:44 GMT + recorded_at: Tue, 23 Apr 2024 11:19:25 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7oKuuB1fWySnyFTNOWm1&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNhKuuB1fWySn8sb4JhFU&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_z2IxgLmQP4XsOi","request_duration_ms":509}}' + - '{"last_request_metrics":{"request_id":"req_v9WiVetN61i25Q","request_duration_ms":434}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:45 GMT + - Tue, 23 Apr 2024 11:19:26 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - c43a598b-483e-40fb-9c30-350c1995da11 + - e2ac6842-4c60-4343-b7e2-b8c0da78f857 Original-Request: - - req_KaAaukm0qPOKiL + - req_j8reuQxyiungfx Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_KaAaukm0qPOKiL + - req_j8reuQxyiungfx Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7oKuuB1fWySn1is54UOr", + "id": "pi_3P8hNhKuuB1fWySn2qjDLIwr", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393524, + "created": 1713871165, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7oKuuB1fWySnyFTNOWm1", + "payment_method": "pm_1P8hNhKuuB1fWySn8sb4JhFU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:45 GMT + recorded_at: Tue, 23 Apr 2024 11:19:26 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7oKuuB1fWySn1is54UOr/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNhKuuB1fWySn2qjDLIwr/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_KaAaukm0qPOKiL","request_duration_ms":508}}' + - '{"last_request_metrics":{"request_id":"req_j8reuQxyiungfx","request_duration_ms":508}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:46 GMT + - Tue, 23 Apr 2024 11:19:26 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 20e1d8fd-31b7-4db5-b920-727c6ec8e1a5 + - d701ad83-98d7-469d-b63d-2433a0e37d76 Original-Request: - - req_4fRJWIkacIhtYr + - req_E8zwsU76kNilMK Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_4fRJWIkacIhtYr + - req_E8zwsU76kNilMK Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7oKuuB1fWySn1is54UOr", + "id": "pi_3P8hNhKuuB1fWySn2qjDLIwr", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393524, + "created": 1713871165, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7oKuuB1fWySn1Lmj8fEo", + "latest_charge": "ch_3P8hNhKuuB1fWySn2p3hpQaM", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7oKuuB1fWySnyFTNOWm1", + "payment_method": "pm_1P8hNhKuuB1fWySn8sb4JhFU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:46 GMT + recorded_at: Tue, 23 Apr 2024 11:19:27 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7oKuuB1fWySn1is54UOr + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNhKuuB1fWySn2qjDLIwr body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_4fRJWIkacIhtYr","request_duration_ms":1023}}' + - '{"last_request_metrics":{"request_id":"req_E8zwsU76kNilMK","request_duration_ms":919}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:46 GMT + - Tue, 23 Apr 2024 11:19:27 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_lRsRRyRRsiSjey + - req_TK5D8Co2zE26qf Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7oKuuB1fWySn1is54UOr", + "id": "pi_3P8hNhKuuB1fWySn2qjDLIwr", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393524, + "created": 1713871165, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7oKuuB1fWySn1Lmj8fEo", + "latest_charge": "ch_3P8hNhKuuB1fWySn2p3hpQaM", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7oKuuB1fWySnyFTNOWm1", + "payment_method": "pm_1P8hNhKuuB1fWySn8sb4JhFU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:46 GMT + recorded_at: Tue, 23 Apr 2024 11:19:27 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7oKuuB1fWySn1is54UOr/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNhKuuB1fWySn2qjDLIwr/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_lRsRRyRRsiSjey","request_duration_ms":408}}' + - '{"last_request_metrics":{"request_id":"req_TK5D8Co2zE26qf","request_duration_ms":323}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:47 GMT + - Tue, 23 Apr 2024 11:19:28 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 15695f82-de91-43c9-9f1b-3f2df3c316e3 + - 10dad9b1-2c30-48db-97a5-c36c7a03b59c Original-Request: - - req_xMpudJ6IknmEGY + - req_HXV8nXhQy2SJn4 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_xMpudJ6IknmEGY + - req_HXV8nXhQy2SJn4 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7oKuuB1fWySn1is54UOr", + "id": "pi_3P8hNhKuuB1fWySn2qjDLIwr", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393524, + "created": 1713871165, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7oKuuB1fWySn1Lmj8fEo", + "latest_charge": "ch_3P8hNhKuuB1fWySn2p3hpQaM", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7oKuuB1fWySnyFTNOWm1", + "payment_method": "pm_1P8hNhKuuB1fWySn8sb4JhFU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:47 GMT + recorded_at: Tue, 23 Apr 2024 11:19:28 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7oKuuB1fWySn1is54UOr + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNhKuuB1fWySn2qjDLIwr body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_xMpudJ6IknmEGY","request_duration_ms":1125}}' + - '{"last_request_metrics":{"request_id":"req_HXV8nXhQy2SJn4","request_duration_ms":1103}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:48 GMT + - Tue, 23 Apr 2024 11:19:28 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_v6DoSIIwC27Nmc + - req_wvPt0Yl7w6VCqT Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7oKuuB1fWySn1is54UOr", + "id": "pi_3P8hNhKuuB1fWySn2qjDLIwr", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393524, + "created": 1713871165, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7oKuuB1fWySn1Lmj8fEo", + "latest_charge": "ch_3P8hNhKuuB1fWySn2p3hpQaM", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7oKuuB1fWySnyFTNOWm1", + "payment_method": "pm_1P8hNhKuuB1fWySn8sb4JhFU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:48 GMT + recorded_at: Tue, 23 Apr 2024 11:19:28 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/returns_payment_intent_id_and_does_not_raise.yml index ce059551c7b..17252e7ba64 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_debit_/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_0gpLm2PRfuTefq","request_duration_ms":408}}' + - '{"last_request_metrics":{"request_id":"req_mRbMJOdTu3yIY8","request_duration_ms":309}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:42 GMT + - Tue, 23 Apr 2024 11:19:23 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - e64e2cc4-76f2-4cd4-9918-a015bd58e3a9 + - '039a00fd-e5dd-40ad-b793-9628bd52a735' Original-Request: - - req_Ol9XydrU5YLSvA + - req_UyvUYS7xGrZret Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_Ol9XydrU5YLSvA + - req_UyvUYS7xGrZret Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7mKuuB1fWySndBLUaRTW", + "id": "pm_1P8hNeKuuB1fWySnHp3wAfDo", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393522, + "created": 1713871163, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:42 GMT + recorded_at: Tue, 23 Apr 2024 11:19:23 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7mKuuB1fWySndBLUaRTW&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNeKuuB1fWySnHp3wAfDo&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_Ol9XydrU5YLSvA","request_duration_ms":491}}' + - '{"last_request_metrics":{"request_id":"req_UyvUYS7xGrZret","request_duration_ms":440}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:42 GMT + - Tue, 23 Apr 2024 11:19:23 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - a4e96058-ee65-4eb9-a91c-13b93abb4871 + - 481dfc12-44b8-4d0f-b2f3-ae50c65b78c6 Original-Request: - - req_za8Lt2fdNu3nL4 + - req_YGKSqZMtxwJgiA Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_za8Lt2fdNu3nL4 + - req_YGKSqZMtxwJgiA Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7mKuuB1fWySn0LrIvmS2", + "id": "pi_3P8hNfKuuB1fWySn2Yk2egJU", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393522, + "created": 1713871163, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7mKuuB1fWySndBLUaRTW", + "payment_method": "pm_1P8hNeKuuB1fWySnHp3wAfDo", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:42 GMT + recorded_at: Tue, 23 Apr 2024 11:19:23 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7mKuuB1fWySn0LrIvmS2/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNfKuuB1fWySn2Yk2egJU/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_za8Lt2fdNu3nL4","request_duration_ms":507}}' + - '{"last_request_metrics":{"request_id":"req_YGKSqZMtxwJgiA","request_duration_ms":507}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:43 GMT + - Tue, 23 Apr 2024 11:19:24 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - bf9ffa33-9c08-43b9-ac00-94b218b14498 + - e95f9c8b-1133-4b97-aa86-56c1f07da7d7 Original-Request: - - req_u0ATTx9OcSqYEk + - req_vGSuRwCcR1RyAj Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_u0ATTx9OcSqYEk + - req_vGSuRwCcR1RyAj Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7mKuuB1fWySn0LrIvmS2", + "id": "pi_3P8hNfKuuB1fWySn2Yk2egJU", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393522, + "created": 1713871163, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7mKuuB1fWySn0hGVmP6d", + "latest_charge": "ch_3P8hNfKuuB1fWySn2KRq6wRh", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7mKuuB1fWySndBLUaRTW", + "payment_method": "pm_1P8hNeKuuB1fWySnHp3wAfDo", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:43 GMT + recorded_at: Tue, 23 Apr 2024 11:19:24 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/captures_the_payment.yml index e4ef2a590fb..e9aa5d1a4c0 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_HOGc3LwxQ8bbGA","request_duration_ms":1148}}' + - '{"last_request_metrics":{"request_id":"req_EZhonT4B1HHjbS","request_duration_ms":885}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:50 GMT + - Tue, 23 Apr 2024 11:19:31 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 1fe1438c-841f-4f5e-a299-2fabc1d46ecf + - df315c23-b165-4b1d-b420-435681f9ed8e Original-Request: - - req_1vVVBpVly5LReT + - req_fmRH5Y0cHaybeg Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_1vVVBpVly5LReT + - req_fmRH5Y0cHaybeg Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7uKuuB1fWySnWpeF7LMi", + "id": "pm_1P8hNnKuuB1fWySnmPDg77iE", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393530, + "created": 1713871171, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:51 GMT + recorded_at: Tue, 23 Apr 2024 11:19:31 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7uKuuB1fWySnWpeF7LMi&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNnKuuB1fWySnmPDg77iE&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_1vVVBpVly5LReT","request_duration_ms":550}}' + - '{"last_request_metrics":{"request_id":"req_fmRH5Y0cHaybeg","request_duration_ms":444}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:51 GMT + - Tue, 23 Apr 2024 11:19:31 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 94e711e6-c607-4fc1-9392-21269895f6be + - 5d75f5ab-15ab-4c78-900a-68b4c33a470d Original-Request: - - req_TpAtg2osej6eim + - req_Vh4PEBHZLLpESl Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_TpAtg2osej6eim + - req_Vh4PEBHZLLpESl Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7vKuuB1fWySn18JZEKhK", + "id": "pi_3P8hNnKuuB1fWySn2FRVl7Gc", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393531, + "created": 1713871171, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7uKuuB1fWySnWpeF7LMi", + "payment_method": "pm_1P8hNnKuuB1fWySnmPDg77iE", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:51 GMT + recorded_at: Tue, 23 Apr 2024 11:19:31 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7vKuuB1fWySn18JZEKhK/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNnKuuB1fWySn2FRVl7Gc/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_TpAtg2osej6eim","request_duration_ms":508}}' + - '{"last_request_metrics":{"request_id":"req_Vh4PEBHZLLpESl","request_duration_ms":384}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:52 GMT + - Tue, 23 Apr 2024 11:19:32 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - e452b479-3f40-4c93-a412-0030ea9331a4 + - 6a9dc13d-6e93-48db-a5b3-98ff10f174c0 Original-Request: - - req_9qMGS66xdSElVa + - req_RFa6ZTWEZIs069 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_9qMGS66xdSElVa + - req_RFa6ZTWEZIs069 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7vKuuB1fWySn18JZEKhK", + "id": "pi_3P8hNnKuuB1fWySn2FRVl7Gc", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393531, + "created": 1713871171, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7vKuuB1fWySn17xjSwFI", + "latest_charge": "ch_3P8hNnKuuB1fWySn2qm1d1OQ", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7uKuuB1fWySnWpeF7LMi", + "payment_method": "pm_1P8hNnKuuB1fWySnmPDg77iE", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:52 GMT + recorded_at: Tue, 23 Apr 2024 11:19:32 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7vKuuB1fWySn18JZEKhK + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNnKuuB1fWySn2FRVl7Gc body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_9qMGS66xdSElVa","request_duration_ms":922}}' + - '{"last_request_metrics":{"request_id":"req_RFa6ZTWEZIs069","request_duration_ms":943}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:52 GMT + - Tue, 23 Apr 2024 11:19:33 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_SiW8OzK5f1KQ8y + - req_sr4TlLw3DLOUtd Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7vKuuB1fWySn18JZEKhK", + "id": "pi_3P8hNnKuuB1fWySn2FRVl7Gc", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393531, + "created": 1713871171, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7vKuuB1fWySn17xjSwFI", + "latest_charge": "ch_3P8hNnKuuB1fWySn2qm1d1OQ", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7uKuuB1fWySnWpeF7LMi", + "payment_method": "pm_1P8hNnKuuB1fWySnmPDg77iE", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:52 GMT + recorded_at: Tue, 23 Apr 2024 11:19:33 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7vKuuB1fWySn18JZEKhK/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNnKuuB1fWySn2FRVl7Gc/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_SiW8OzK5f1KQ8y","request_duration_ms":407}}' + - '{"last_request_metrics":{"request_id":"req_sr4TlLw3DLOUtd","request_duration_ms":314}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:53 GMT + - Tue, 23 Apr 2024 11:19:34 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 6f7efa79-439f-4d6c-9dce-28aa175753a2 + - 330ea30b-03fa-41c7-8902-e0b00cf174c4 Original-Request: - - req_inyBfL3HezoHfX + - req_XVXG040I2GPJwr Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_inyBfL3HezoHfX + - req_XVXG040I2GPJwr Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7vKuuB1fWySn18JZEKhK", + "id": "pi_3P8hNnKuuB1fWySn2FRVl7Gc", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393531, + "created": 1713871171, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7vKuuB1fWySn17xjSwFI", + "latest_charge": "ch_3P8hNnKuuB1fWySn2qm1d1OQ", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7uKuuB1fWySnWpeF7LMi", + "payment_method": "pm_1P8hNnKuuB1fWySnmPDg77iE", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:53 GMT + recorded_at: Tue, 23 Apr 2024 11:19:34 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7vKuuB1fWySn18JZEKhK + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNnKuuB1fWySn2FRVl7Gc body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_inyBfL3HezoHfX","request_duration_ms":1022}}' + - '{"last_request_metrics":{"request_id":"req_XVXG040I2GPJwr","request_duration_ms":1007}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:54 GMT + - Tue, 23 Apr 2024 11:19:34 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_Op5E047dEuFump + - req_azV3R41xItqtxT Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7vKuuB1fWySn18JZEKhK", + "id": "pi_3P8hNnKuuB1fWySn2FRVl7Gc", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393531, + "created": 1713871171, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7vKuuB1fWySn17xjSwFI", + "latest_charge": "ch_3P8hNnKuuB1fWySn2qm1d1OQ", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7uKuuB1fWySnWpeF7LMi", + "payment_method": "pm_1P8hNnKuuB1fWySnmPDg77iE", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:54 GMT + recorded_at: Tue, 23 Apr 2024 11:19:34 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/returns_payment_intent_id_and_does_not_raise.yml index 9eecdc19bd4..5f305bde57c 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Mastercard_prepaid_/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_v6DoSIIwC27Nmc","request_duration_ms":353}}' + - '{"last_request_metrics":{"request_id":"req_wvPt0Yl7w6VCqT","request_duration_ms":296}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:48 GMT + - Tue, 23 Apr 2024 11:19:29 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 9c7f88f2-e81c-413f-bce1-341de7cf7292 + - 3a49e803-5cf9-48e2-ade1-97c65e3e422a Original-Request: - - req_UdvCKCkgZIuBiZ + - req_N9tbjVepiS2OV1 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_UdvCKCkgZIuBiZ + - req_N9tbjVepiS2OV1 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7sKuuB1fWySnWFyGsEIQ", + "id": "pm_1P8hNkKuuB1fWySnFdjTt6h1", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393528, + "created": 1713871169, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:48 GMT + recorded_at: Tue, 23 Apr 2024 11:19:29 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7sKuuB1fWySnWFyGsEIQ&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNkKuuB1fWySnFdjTt6h1&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_UdvCKCkgZIuBiZ","request_duration_ms":551}}' + - '{"last_request_metrics":{"request_id":"req_N9tbjVepiS2OV1","request_duration_ms":476}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:49 GMT + - Tue, 23 Apr 2024 11:19:29 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 1fcf81b3-f980-4602-9b72-85370ab4d77a + - 4563e951-b286-4fc8-89cd-4d84d7ec04de Original-Request: - - req_vtUgVf43aiVJ8f + - req_7BkHqxN6YUu4fr Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_vtUgVf43aiVJ8f + - req_7BkHqxN6YUu4fr Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7sKuuB1fWySn0BTYrhF6", + "id": "pi_3P8hNlKuuB1fWySn0ZdGMla3", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393528, + "created": 1713871169, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7sKuuB1fWySnWFyGsEIQ", + "payment_method": "pm_1P8hNkKuuB1fWySnFdjTt6h1", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:49 GMT + recorded_at: Tue, 23 Apr 2024 11:19:29 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7sKuuB1fWySn0BTYrhF6/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNlKuuB1fWySn0ZdGMla3/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_vtUgVf43aiVJ8f","request_duration_ms":512}}' + - '{"last_request_metrics":{"request_id":"req_7BkHqxN6YUu4fr","request_duration_ms":406}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:50 GMT + - Tue, 23 Apr 2024 11:19:30 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - b8ea7e88-797c-4cdb-aa85-3b48de057a7e + - cdd14215-b031-4a61-bc4b-92da40a0841c Original-Request: - - req_HOGc3LwxQ8bbGA + - req_EZhonT4B1HHjbS Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_HOGc3LwxQ8bbGA + - req_EZhonT4B1HHjbS Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7sKuuB1fWySn0BTYrhF6", + "id": "pi_3P8hNlKuuB1fWySn0ZdGMla3", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393528, + "created": 1713871169, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7sKuuB1fWySn0vJDrxH0", + "latest_charge": "ch_3P8hNlKuuB1fWySn0ITByrSy", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7sKuuB1fWySnWFyGsEIQ", + "payment_method": "pm_1P8hNkKuuB1fWySnFdjTt6h1", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:50 GMT + recorded_at: Tue, 23 Apr 2024 11:19:30 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/captures_the_payment.yml index dbb80c2b06e..582d3642589 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_JvAWETBQMvlvuD","request_duration_ms":908}}' + - '{"last_request_metrics":{"request_id":"req_bP4NkTLpFzZbuW","request_duration_ms":1027}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:41 GMT + - Tue, 23 Apr 2024 11:20:19 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - a1bbde01-ca0d-4c26-93cd-1e4f1954f573 + - bb3b4158-6c85-4c9b-a25f-f8748203051f Original-Request: - - req_WbHGXVY9PjhJVD + - req_EVB9gawZ0NO0cM Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_WbHGXVY9PjhJVD + - req_EVB9gawZ0NO0cM Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8jKuuB1fWySn9AdWGLTZ", + "id": "pm_1P8hOZKuuB1fWySncTeaMaWz", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393581, + "created": 1713871219, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:41 GMT + recorded_at: Tue, 23 Apr 2024 11:20:20 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8jKuuB1fWySn9AdWGLTZ&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOZKuuB1fWySncTeaMaWz&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_WbHGXVY9PjhJVD","request_duration_ms":471}}' + - '{"last_request_metrics":{"request_id":"req_EVB9gawZ0NO0cM","request_duration_ms":418}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:42 GMT + - Tue, 23 Apr 2024 11:20:20 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 944e09dd-006c-422b-b5bb-eb6c77469cdd + - 0a313119-e25a-41cb-bbd3-b93289bb6178 Original-Request: - - req_kSQNmUwiVuPkG4 + - req_SJ5xytVAZIFOgh Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_kSQNmUwiVuPkG4 + - req_SJ5xytVAZIFOgh Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8jKuuB1fWySn250YdCNa", + "id": "pi_3P8hOaKuuB1fWySn1Yu4g8ob", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393581, + "created": 1713871220, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8jKuuB1fWySn9AdWGLTZ", + "payment_method": "pm_1P8hOZKuuB1fWySncTeaMaWz", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:42 GMT + recorded_at: Tue, 23 Apr 2024 11:20:20 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8jKuuB1fWySn250YdCNa/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOaKuuB1fWySn1Yu4g8ob/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_kSQNmUwiVuPkG4","request_duration_ms":512}}' + - '{"last_request_metrics":{"request_id":"req_SJ5xytVAZIFOgh","request_duration_ms":425}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:43 GMT + - Tue, 23 Apr 2024 11:20:21 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 7bef0dec-19ab-4366-9d74-eb26636d7431 + - 5ad3574a-b45c-429c-9de6-e7de7f9481c1 Original-Request: - - req_GIYOLCt5eqstCR + - req_rozwNpdZfaAWUK Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_GIYOLCt5eqstCR + - req_rozwNpdZfaAWUK Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8jKuuB1fWySn250YdCNa", + "id": "pi_3P8hOaKuuB1fWySn1Yu4g8ob", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393581, + "created": 1713871220, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8jKuuB1fWySn2qTroa6X", + "latest_charge": "ch_3P8hOaKuuB1fWySn1YRaPZ42", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8jKuuB1fWySn9AdWGLTZ", + "payment_method": "pm_1P8hOZKuuB1fWySncTeaMaWz", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:43 GMT + recorded_at: Tue, 23 Apr 2024 11:20:21 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8jKuuB1fWySn250YdCNa + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOaKuuB1fWySn1Yu4g8ob body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_GIYOLCt5eqstCR","request_duration_ms":918}}' + - '{"last_request_metrics":{"request_id":"req_rozwNpdZfaAWUK","request_duration_ms":1019}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:43 GMT + - Tue, 23 Apr 2024 11:20:21 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_R7dwVAyi9FFDep + - req_RuVKIBS7HioGF9 Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8jKuuB1fWySn250YdCNa", + "id": "pi_3P8hOaKuuB1fWySn1Yu4g8ob", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393581, + "created": 1713871220, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8jKuuB1fWySn2qTroa6X", + "latest_charge": "ch_3P8hOaKuuB1fWySn1YRaPZ42", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8jKuuB1fWySn9AdWGLTZ", + "payment_method": "pm_1P8hOZKuuB1fWySncTeaMaWz", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:43 GMT + recorded_at: Tue, 23 Apr 2024 11:20:21 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8jKuuB1fWySn250YdCNa/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOaKuuB1fWySn1Yu4g8ob/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_R7dwVAyi9FFDep","request_duration_ms":406}}' + - '{"last_request_metrics":{"request_id":"req_RuVKIBS7HioGF9","request_duration_ms":324}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:44 GMT + - Tue, 23 Apr 2024 11:20:22 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 2b32b0fd-f726-4792-9a3c-55a372de1cf8 + - 4bb9f1bc-2642-4e97-afcf-91bc470e4bba Original-Request: - - req_y6Fs9bKxfUuhaR + - req_IofHT9JafBnq1r Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_y6Fs9bKxfUuhaR + - req_IofHT9JafBnq1r Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8jKuuB1fWySn250YdCNa", + "id": "pi_3P8hOaKuuB1fWySn1Yu4g8ob", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393581, + "created": 1713871220, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8jKuuB1fWySn2qTroa6X", + "latest_charge": "ch_3P8hOaKuuB1fWySn1YRaPZ42", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8jKuuB1fWySn9AdWGLTZ", + "payment_method": "pm_1P8hOZKuuB1fWySncTeaMaWz", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:44 GMT + recorded_at: Tue, 23 Apr 2024 11:20:22 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8jKuuB1fWySn250YdCNa + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOaKuuB1fWySn1Yu4g8ob body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_y6Fs9bKxfUuhaR","request_duration_ms":1127}}' + - '{"last_request_metrics":{"request_id":"req_IofHT9JafBnq1r","request_duration_ms":1033}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:44 GMT + - Tue, 23 Apr 2024 11:20:23 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_orhSEXIZyv0Rt7 + - req_v1hTds2XBdLNE0 Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8jKuuB1fWySn250YdCNa", + "id": "pi_3P8hOaKuuB1fWySn1Yu4g8ob", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393581, + "created": 1713871220, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8jKuuB1fWySn2qTroa6X", + "latest_charge": "ch_3P8hOaKuuB1fWySn1YRaPZ42", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8jKuuB1fWySn9AdWGLTZ", + "payment_method": "pm_1P8hOZKuuB1fWySncTeaMaWz", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:45 GMT + recorded_at: Tue, 23 Apr 2024 11:20:23 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/returns_payment_intent_id_and_does_not_raise.yml index 08838a6fd32..51ab244735c 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_e3is6LFByX27Sh","request_duration_ms":407}}' + - '{"last_request_metrics":{"request_id":"req_aZYwq636amcQQc","request_duration_ms":318}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:39 GMT + - Tue, 23 Apr 2024 11:20:17 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 237c6bea-9582-4bb5-a913-6ba1de54b654 + - f6ae69fe-caa2-4776-ba8b-5a209fba4053 Original-Request: - - req_tWpGVf0e6fNmZ5 + - req_ZY80R85ZYCz9YZ Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_tWpGVf0e6fNmZ5 + - req_ZY80R85ZYCz9YZ Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8hKuuB1fWySnpRASYAEC", + "id": "pm_1P8hOXKuuB1fWySnGH4SNW9J", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393579, + "created": 1713871217, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:39 GMT + recorded_at: Tue, 23 Apr 2024 11:20:17 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8hKuuB1fWySnpRASYAEC&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOXKuuB1fWySnGH4SNW9J&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_tWpGVf0e6fNmZ5","request_duration_ms":492}}' + - '{"last_request_metrics":{"request_id":"req_ZY80R85ZYCz9YZ","request_duration_ms":457}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:40 GMT + - Tue, 23 Apr 2024 11:20:18 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - c7e3db0b-4311-4082-8945-e83d7b4d10bd + - 5cea98bf-f945-47b1-900a-3bfa2fa00381 Original-Request: - - req_8x2G5HfJxK0KO5 + - req_dHOX5pEyy1Rwqg Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_8x2G5HfJxK0KO5 + - req_dHOX5pEyy1Rwqg Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8hKuuB1fWySn2vEX8YKz", + "id": "pi_3P8hOXKuuB1fWySn204Us72T", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393579, + "created": 1713871217, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8hKuuB1fWySnpRASYAEC", + "payment_method": "pm_1P8hOXKuuB1fWySnGH4SNW9J", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:40 GMT + recorded_at: Tue, 23 Apr 2024 11:20:18 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8hKuuB1fWySn2vEX8YKz/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOXKuuB1fWySn204Us72T/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_8x2G5HfJxK0KO5","request_duration_ms":417}}' + - '{"last_request_metrics":{"request_id":"req_dHOX5pEyy1Rwqg","request_duration_ms":401}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:41 GMT + - Tue, 23 Apr 2024 11:20:18 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 2d04eaf5-4e5b-400b-81fd-5bc46e1c6c7e + - 1e8391df-7965-48f2-834e-c9e5255856c1 Original-Request: - - req_JvAWETBQMvlvuD + - req_bP4NkTLpFzZbuW Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_JvAWETBQMvlvuD + - req_bP4NkTLpFzZbuW Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8hKuuB1fWySn2vEX8YKz", + "id": "pi_3P8hOXKuuB1fWySn204Us72T", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393579, + "created": 1713871217, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8hKuuB1fWySn2fdTCbTk", + "latest_charge": "ch_3P8hOXKuuB1fWySn2ofgtnCQ", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8hKuuB1fWySnpRASYAEC", + "payment_method": "pm_1P8hOXKuuB1fWySnGH4SNW9J", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:41 GMT + recorded_at: Tue, 23 Apr 2024 11:20:19 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/captures_the_payment.yml index cb383e17ac1..68b4007571f 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_5M6BDrkfp88ITK","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_RnxUf0JS1gq5pi","request_duration_ms":880}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:47 GMT + - Tue, 23 Apr 2024 11:20:25 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - b8f13c2d-6b72-4bf4-9d1e-6f438a65694d + - e4ed1efc-2736-49c3-8081-dd0dee73bf6f Original-Request: - - req_6KKK2rncrBEXzj + - req_TkgKKJnnyw8IgZ Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_6KKK2rncrBEXzj + - req_TkgKKJnnyw8IgZ Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8pKuuB1fWySnMcLJE9qc", + "id": "pm_1P8hOfKuuB1fWySnHIvCaKdC", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393587, + "created": 1713871225, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:47 GMT + recorded_at: Tue, 23 Apr 2024 11:20:25 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8pKuuB1fWySnMcLJE9qc&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOfKuuB1fWySnHIvCaKdC&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_6KKK2rncrBEXzj","request_duration_ms":477}}' + - '{"last_request_metrics":{"request_id":"req_TkgKKJnnyw8IgZ","request_duration_ms":440}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:48 GMT + - Tue, 23 Apr 2024 11:20:26 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 86675ad2-e66f-4fb8-a0ca-2cad53fcd12f + - 3b5b4fe7-0202-49d9-ae13-9e4b8f80da27 Original-Request: - - req_LTpYcCoJAvnCaa + - req_Rs0q7kmXwtQZr4 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_LTpYcCoJAvnCaa + - req_Rs0q7kmXwtQZr4 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8pKuuB1fWySn0p9t3Nhi", + "id": "pi_3P8hOgKuuB1fWySn0NecCO37", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393587, + "created": 1713871226, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8pKuuB1fWySnMcLJE9qc", + "payment_method": "pm_1P8hOfKuuB1fWySnHIvCaKdC", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:48 GMT + recorded_at: Tue, 23 Apr 2024 11:20:26 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8pKuuB1fWySn0p9t3Nhi/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOgKuuB1fWySn0NecCO37/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_LTpYcCoJAvnCaa","request_duration_ms":511}}' + - '{"last_request_metrics":{"request_id":"req_Rs0q7kmXwtQZr4","request_duration_ms":408}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:49 GMT + - Tue, 23 Apr 2024 11:20:27 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - ec353a06-e37e-4ea6-b2a9-5e54bd365115 + - f51c7265-9f17-4b42-b6c4-50dd4ecf8a56 Original-Request: - - req_DJRhc7k9YcN7Gv + - req_vcysvYlLEhNqwl Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_DJRhc7k9YcN7Gv + - req_vcysvYlLEhNqwl Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8pKuuB1fWySn0p9t3Nhi", + "id": "pi_3P8hOgKuuB1fWySn0NecCO37", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393587, + "created": 1713871226, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8pKuuB1fWySn0cAJ3Nx0", + "latest_charge": "ch_3P8hOgKuuB1fWySn0xd3l2WL", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8pKuuB1fWySnMcLJE9qc", + "payment_method": "pm_1P8hOfKuuB1fWySnHIvCaKdC", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:49 GMT + recorded_at: Tue, 23 Apr 2024 11:20:27 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8pKuuB1fWySn0p9t3Nhi + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOgKuuB1fWySn0NecCO37 body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_DJRhc7k9YcN7Gv","request_duration_ms":966}}' + - '{"last_request_metrics":{"request_id":"req_vcysvYlLEhNqwl","request_duration_ms":1018}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:49 GMT + - Tue, 23 Apr 2024 11:20:27 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_es3p52W7zr7ZNm + - req_2bALfgDj6AgBdB Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8pKuuB1fWySn0p9t3Nhi", + "id": "pi_3P8hOgKuuB1fWySn0NecCO37", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393587, + "created": 1713871226, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8pKuuB1fWySn0cAJ3Nx0", + "latest_charge": "ch_3P8hOgKuuB1fWySn0xd3l2WL", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8pKuuB1fWySnMcLJE9qc", + "payment_method": "pm_1P8hOfKuuB1fWySnHIvCaKdC", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:49 GMT + recorded_at: Tue, 23 Apr 2024 11:20:27 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8pKuuB1fWySn0p9t3Nhi/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOgKuuB1fWySn0NecCO37/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_es3p52W7zr7ZNm","request_duration_ms":364}}' + - '{"last_request_metrics":{"request_id":"req_2bALfgDj6AgBdB","request_duration_ms":406}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:50 GMT + - Tue, 23 Apr 2024 11:20:28 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 165ad06c-1c87-478e-be81-8de26316faea + - 9f32e62f-cfcb-476d-befa-a4632c831673 Original-Request: - - req_taD54UO4v1MIBe + - req_Q1bpHGCcGlxb5Z Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_taD54UO4v1MIBe + - req_Q1bpHGCcGlxb5Z Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8pKuuB1fWySn0p9t3Nhi", + "id": "pi_3P8hOgKuuB1fWySn0NecCO37", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393587, + "created": 1713871226, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8pKuuB1fWySn0cAJ3Nx0", + "latest_charge": "ch_3P8hOgKuuB1fWySn0xd3l2WL", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8pKuuB1fWySnMcLJE9qc", + "payment_method": "pm_1P8hOfKuuB1fWySnHIvCaKdC", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:50 GMT + recorded_at: Tue, 23 Apr 2024 11:20:28 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8pKuuB1fWySn0p9t3Nhi + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOgKuuB1fWySn0NecCO37 body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_taD54UO4v1MIBe","request_duration_ms":1021}}' + - '{"last_request_metrics":{"request_id":"req_Q1bpHGCcGlxb5Z","request_duration_ms":1018}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:50 GMT + - Tue, 23 Apr 2024 11:20:28 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_zvf4CAVwSgnYlD + - req_CLAQeFdk7h5EGj Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8pKuuB1fWySn0p9t3Nhi", + "id": "pi_3P8hOgKuuB1fWySn0NecCO37", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393587, + "created": 1713871226, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8pKuuB1fWySn0cAJ3Nx0", + "latest_charge": "ch_3P8hOgKuuB1fWySn0xd3l2WL", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8pKuuB1fWySnMcLJE9qc", + "payment_method": "pm_1P8hOfKuuB1fWySnHIvCaKdC", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:50 GMT + recorded_at: Tue, 23 Apr 2024 11:20:29 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/returns_payment_intent_id_and_does_not_raise.yml index 47a2a5b85c0..de46a20720e 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_UnionPay_19-digit_card_/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_orhSEXIZyv0Rt7","request_duration_ms":405}}' + - '{"last_request_metrics":{"request_id":"req_v1hTds2XBdLNE0","request_duration_ms":326}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:45 GMT + - Tue, 23 Apr 2024 11:20:23 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - ad63d10c-cb0a-4eb7-8845-89cffbb4a46c + - 538cc1fe-9589-4272-be89-1e21c4a7ca96 Original-Request: - - req_5scTfSWgF8tVBm + - req_0WBclh6fOiomtq Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_5scTfSWgF8tVBm + - req_0WBclh6fOiomtq Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h8nKuuB1fWySn8lYg1dY8", + "id": "pm_1P8hOdKuuB1fWySnaS7LWBFU", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393585, + "created": 1713871223, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:39:45 GMT + recorded_at: Tue, 23 Apr 2024 11:20:23 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h8nKuuB1fWySn8lYg1dY8&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hOdKuuB1fWySnaS7LWBFU&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_5scTfSWgF8tVBm","request_duration_ms":496}}' + - '{"last_request_metrics":{"request_id":"req_0WBclh6fOiomtq","request_duration_ms":425}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:45 GMT + - Tue, 23 Apr 2024 11:20:24 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 92c73f49-fb31-44e6-aa4e-6da9225452ac + - d9e0c093-a716-488d-a7ac-ce6ee9a6b173 Original-Request: - - req_U0ctc0agMjXrZh + - req_aXWW7zXQO3wrcm Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_U0ctc0agMjXrZh + - req_aXWW7zXQO3wrcm Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8nKuuB1fWySn2N7eDEQt", + "id": "pi_3P8hOdKuuB1fWySn2eWYNwxe", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393585, + "created": 1713871223, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8nKuuB1fWySn8lYg1dY8", + "payment_method": "pm_1P8hOdKuuB1fWySnaS7LWBFU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:46 GMT + recorded_at: Tue, 23 Apr 2024 11:20:24 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h8nKuuB1fWySn2N7eDEQt/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hOdKuuB1fWySn2eWYNwxe/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_U0ctc0agMjXrZh","request_duration_ms":510}}' + - '{"last_request_metrics":{"request_id":"req_aXWW7zXQO3wrcm","request_duration_ms":427}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:39:46 GMT + - Tue, 23 Apr 2024 11:20:24 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - b3a27f7f-5c71-42c5-b19d-11fd62e44765 + - 5ce32ea5-c223-4268-b7bb-bc30816cd714 Original-Request: - - req_5M6BDrkfp88ITK + - req_RnxUf0JS1gq5pi Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_5M6BDrkfp88ITK + - req_RnxUf0JS1gq5pi Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h8nKuuB1fWySn2N7eDEQt", + "id": "pi_3P8hOdKuuB1fWySn2eWYNwxe", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393585, + "created": 1713871223, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h8nKuuB1fWySn2N5ABsKa", + "latest_charge": "ch_3P8hOdKuuB1fWySn2ILu0oRo", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h8nKuuB1fWySn8lYg1dY8", + "payment_method": "pm_1P8hOdKuuB1fWySnaS7LWBFU", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:39:47 GMT + recorded_at: Tue, 23 Apr 2024 11:20:25 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/captures_the_payment.yml index 58a5662db97..96d4fd499c8 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_GinJvOrjI3jPoK","request_duration_ms":1124}}' + - '{"last_request_metrics":{"request_id":"req_d5uyFrP9kkS6B8","request_duration_ms":950}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:19 GMT + - Tue, 23 Apr 2024 11:19:01 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 64910d91-161c-4a0a-a7b1-027463f9f932 + - 528b7f7b-a6cf-4405-8092-7d33c26055d2 Original-Request: - - req_EfwFVjR7SzuG4N + - req_dDrPytC5ffagfe Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_EfwFVjR7SzuG4N + - req_dDrPytC5ffagfe Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7PKuuB1fWySnpJPlGzBx", + "id": "pm_1P8hNIKuuB1fWySn5cotK7tE", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393499, + "created": 1713871141, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:19 GMT + recorded_at: Tue, 23 Apr 2024 11:19:01 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7PKuuB1fWySnpJPlGzBx&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNIKuuB1fWySn5cotK7tE&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_EfwFVjR7SzuG4N","request_duration_ms":470}}' + - '{"last_request_metrics":{"request_id":"req_dDrPytC5ffagfe","request_duration_ms":541}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:19 GMT + - Tue, 23 Apr 2024 11:19:01 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - c28f48c9-e737-4e5f-a96b-4162ca0d54e5 + - 01a65e32-cad1-4bcf-bc88-d124a4a3d3fd Original-Request: - - req_okNPf46lsUW0NZ + - req_79a299jxBJw8dW Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_okNPf46lsUW0NZ + - req_79a299jxBJw8dW Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7PKuuB1fWySn2KfYVSKl", + "id": "pi_3P8hNJKuuB1fWySn2dkxDwHa", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393499, + "created": 1713871141, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7PKuuB1fWySnpJPlGzBx", + "payment_method": "pm_1P8hNIKuuB1fWySn5cotK7tE", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:19 GMT + recorded_at: Tue, 23 Apr 2024 11:19:01 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7PKuuB1fWySn2KfYVSKl/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNJKuuB1fWySn2dkxDwHa/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_okNPf46lsUW0NZ","request_duration_ms":583}}' + - '{"last_request_metrics":{"request_id":"req_79a299jxBJw8dW","request_duration_ms":422}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:21 GMT + - Tue, 23 Apr 2024 11:19:02 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 60f1d6ad-7f81-4d2a-9ef1-41f19f44e4cc + - 330b9db2-d4d4-48d6-a673-53a39613ffec Original-Request: - - req_4sYqtfUeHgBS1h + - req_UhNEuuDoi3tbC4 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_4sYqtfUeHgBS1h + - req_UhNEuuDoi3tbC4 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7PKuuB1fWySn2KfYVSKl", + "id": "pi_3P8hNJKuuB1fWySn2dkxDwHa", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393499, + "created": 1713871141, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7PKuuB1fWySn2L8Ip9bg", + "latest_charge": "ch_3P8hNJKuuB1fWySn2CWq8PDc", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7PKuuB1fWySnpJPlGzBx", + "payment_method": "pm_1P8hNIKuuB1fWySn5cotK7tE", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:21 GMT + recorded_at: Tue, 23 Apr 2024 11:19:02 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7PKuuB1fWySn2KfYVSKl + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNJKuuB1fWySn2dkxDwHa body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_4sYqtfUeHgBS1h","request_duration_ms":1052}}' + - '{"last_request_metrics":{"request_id":"req_UhNEuuDoi3tbC4","request_duration_ms":1102}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:21 GMT + - Tue, 23 Apr 2024 11:19:03 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_InA4UXgP7ovZil + - req_KvOZhpfMTPf3Dh Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7PKuuB1fWySn2KfYVSKl", + "id": "pi_3P8hNJKuuB1fWySn2dkxDwHa", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393499, + "created": 1713871141, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7PKuuB1fWySn2L8Ip9bg", + "latest_charge": "ch_3P8hNJKuuB1fWySn2CWq8PDc", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7PKuuB1fWySnpJPlGzBx", + "payment_method": "pm_1P8hNIKuuB1fWySn5cotK7tE", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:21 GMT + recorded_at: Tue, 23 Apr 2024 11:19:03 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7PKuuB1fWySn2KfYVSKl/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNJKuuB1fWySn2dkxDwHa/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_InA4UXgP7ovZil","request_duration_ms":408}}' + - '{"last_request_metrics":{"request_id":"req_KvOZhpfMTPf3Dh","request_duration_ms":407}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:22 GMT + - Tue, 23 Apr 2024 11:19:04 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 211c48d0-f153-469b-a5f7-bc0ec77f4820 + - af9eb1dd-fe0b-43f7-b9c3-56645d113af2 Original-Request: - - req_3pEsevymAurQCW + - req_WH8VJK1GQ8VwJ6 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_3pEsevymAurQCW + - req_WH8VJK1GQ8VwJ6 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7PKuuB1fWySn2KfYVSKl", + "id": "pi_3P8hNJKuuB1fWySn2dkxDwHa", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393499, + "created": 1713871141, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7PKuuB1fWySn2L8Ip9bg", + "latest_charge": "ch_3P8hNJKuuB1fWySn2CWq8PDc", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7PKuuB1fWySnpJPlGzBx", + "payment_method": "pm_1P8hNIKuuB1fWySn5cotK7tE", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:22 GMT + recorded_at: Tue, 23 Apr 2024 11:19:04 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7PKuuB1fWySn2KfYVSKl + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNJKuuB1fWySn2dkxDwHa body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_3pEsevymAurQCW","request_duration_ms":1126}}' + - '{"last_request_metrics":{"request_id":"req_WH8VJK1GQ8VwJ6","request_duration_ms":1123}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:22 GMT + - Tue, 23 Apr 2024 11:19:04 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_tfIcynbnVwUvuZ + - req_xP6oHQTgDjlOHG Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7PKuuB1fWySn2KfYVSKl", + "id": "pi_3P8hNJKuuB1fWySn2dkxDwHa", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393499, + "created": 1713871141, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7PKuuB1fWySn2L8Ip9bg", + "latest_charge": "ch_3P8hNJKuuB1fWySn2CWq8PDc", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7PKuuB1fWySnpJPlGzBx", + "payment_method": "pm_1P8hNIKuuB1fWySn5cotK7tE", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:22 GMT + recorded_at: Tue, 23 Apr 2024 11:19:04 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/returns_payment_intent_id_and_does_not_raise.yml index 324b84463d2..06aff811ccd 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa/returns_payment_intent_id_and_does_not_raise.yml @@ -13,8 +13,6 @@ http_interactions: - "" Content-Type: - application/x-www-form-urlencoded - X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_6erFBt8I8770U0","request_duration_ms":1019}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +29,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:16 GMT + - Tue, 23 Apr 2024 11:18:58 GMT Content-Type: - application/json Content-Length: @@ -58,15 +56,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - d437847d-b101-4d30-85e5-ade1f734a58c + - 29eca7b2-af0e-4828-a9a0-896d5ceb00aa Original-Request: - - req_ML8x0xRXjzSwUg + - req_srfnyp4Vm6VFzI Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_ML8x0xRXjzSwUg + - req_srfnyp4Vm6VFzI Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +79,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7MKuuB1fWySnC2fh20kl", + "id": "pm_1P8hNFKuuB1fWySntyz6ny7q", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +121,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393496, + "created": 1713871138, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:17 GMT + recorded_at: Tue, 23 Apr 2024 11:18:58 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7MKuuB1fWySnC2fh20kl&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNFKuuB1fWySntyz6ny7q&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +142,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_ML8x0xRXjzSwUg","request_duration_ms":498}}' + - '{"last_request_metrics":{"request_id":"req_srfnyp4Vm6VFzI","request_duration_ms":669}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +159,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:17 GMT + - Tue, 23 Apr 2024 11:18:58 GMT Content-Type: - application/json Content-Length: @@ -188,15 +186,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 1c64ce4f-10a5-4d25-b4a3-0770f59fe416 + - 9f47d039-c6ff-454b-b4fe-f984ac0ff197 Original-Request: - - req_byoPGN1UVs38aW + - req_6QkVOZPnSbKaAI Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_byoPGN1UVs38aW + - req_6QkVOZPnSbKaAI Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +209,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7NKuuB1fWySn04AMksxW", + "id": "pi_3P8hNGKuuB1fWySn0dvhu9lG", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +225,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393497, + "created": 1713871138, "currency": "eur", "customer": null, "description": null, @@ -238,7 +236,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7MKuuB1fWySnC2fh20kl", + "payment_method": "pm_1P8hNFKuuB1fWySntyz6ny7q", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +261,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:17 GMT + recorded_at: Tue, 23 Apr 2024 11:18:58 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7NKuuB1fWySn04AMksxW/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNGKuuB1fWySn0dvhu9lG/confirm body: encoding: US-ASCII string: '' @@ -278,7 +276,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_byoPGN1UVs38aW","request_duration_ms":508}}' + - '{"last_request_metrics":{"request_id":"req_6QkVOZPnSbKaAI","request_duration_ms":681}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +293,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:18 GMT + - Tue, 23 Apr 2024 11:18:59 GMT Content-Type: - application/json Content-Length: @@ -323,15 +321,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 71a3372c-0bae-4c21-b1d3-3f15c6395ab5 + - f481e055-83bb-47db-a795-9fe3411f9bb5 Original-Request: - - req_GinJvOrjI3jPoK + - req_d5uyFrP9kkS6B8 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_GinJvOrjI3jPoK + - req_d5uyFrP9kkS6B8 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +344,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7NKuuB1fWySn04AMksxW", + "id": "pi_3P8hNGKuuB1fWySn0dvhu9lG", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +360,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393497, + "created": 1713871138, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7NKuuB1fWySn0YW3AXzB", + "latest_charge": "ch_3P8hNGKuuB1fWySn0zASG84d", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7MKuuB1fWySnC2fh20kl", + "payment_method": "pm_1P8hNFKuuB1fWySntyz6ny7q", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +396,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:18 GMT + recorded_at: Tue, 23 Apr 2024 11:18:59 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/captures_the_payment.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/captures_the_payment.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/captures_the_payment.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/captures_the_payment.yml index 63a1b68cf12..be1da398411 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/captures_the_payment.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/captures_the_payment.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_pXfL18SxvJbCBU","request_duration_ms":1010}}' + - '{"last_request_metrics":{"request_id":"req_qzjFSWd3iBDt8c","request_duration_ms":1037}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:25 GMT + - Tue, 23 Apr 2024 11:19:07 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - bd815d42-e8c8-4979-b188-e0c462044392 + - e99d6578-ea57-4440-8973-a36e96b2cd95 Original-Request: - - req_219VLTcIujaPsx + - req_n9cAIF63Vn9pzi Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_219VLTcIujaPsx + - req_n9cAIF63Vn9pzi Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7VKuuB1fWySnsX7ucKLX", + "id": "pm_1P8hNPKuuB1fWySnDHy6ZIyV", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393505, + "created": 1713871147, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:25 GMT + recorded_at: Tue, 23 Apr 2024 11:19:07 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7VKuuB1fWySnsX7ucKLX&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNPKuuB1fWySnDHy6ZIyV&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_219VLTcIujaPsx","request_duration_ms":458}}' + - '{"last_request_metrics":{"request_id":"req_n9cAIF63Vn9pzi","request_duration_ms":515}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:26 GMT + - Tue, 23 Apr 2024 11:19:07 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 98fe770f-204b-4bf3-ba9c-2a26562a7e09 + - cc5554c9-962a-49b0-a9c6-0ff4a8a161db Original-Request: - - req_QTyZoiVYbbIw5w + - req_FO5ZkOTZ1eJ487 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_QTyZoiVYbbIw5w + - req_FO5ZkOTZ1eJ487 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7VKuuB1fWySn2XHLMoF9", + "id": "pi_3P8hNPKuuB1fWySn1YmwOcGM", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393505, + "created": 1713871147, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7VKuuB1fWySnsX7ucKLX", + "payment_method": "pm_1P8hNPKuuB1fWySnDHy6ZIyV", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:26 GMT + recorded_at: Tue, 23 Apr 2024 11:19:08 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7VKuuB1fWySn2XHLMoF9/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNPKuuB1fWySn1YmwOcGM/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_QTyZoiVYbbIw5w","request_duration_ms":437}}' + - '{"last_request_metrics":{"request_id":"req_FO5ZkOTZ1eJ487","request_duration_ms":510}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:27 GMT + - Tue, 23 Apr 2024 11:19:09 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - c754d625-abdc-429c-b974-e066f6a364d9 + - be137c15-af71-411d-aecb-81c5d20d0724 Original-Request: - - req_42Ejxtw3ANOc7Z + - req_D4cdH7OWLVrSRp Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_42Ejxtw3ANOc7Z + - req_D4cdH7OWLVrSRp Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7VKuuB1fWySn2XHLMoF9", + "id": "pi_3P8hNPKuuB1fWySn1YmwOcGM", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393505, + "created": 1713871147, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7VKuuB1fWySn28tKnIYE", + "latest_charge": "ch_3P8hNPKuuB1fWySn186LYHZO", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7VKuuB1fWySnsX7ucKLX", + "payment_method": "pm_1P8hNPKuuB1fWySnDHy6ZIyV", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,10 +398,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:27 GMT + recorded_at: Tue, 23 Apr 2024 11:19:09 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7VKuuB1fWySn2XHLMoF9 + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNPKuuB1fWySn1YmwOcGM body: encoding: US-ASCII string: '' @@ -413,7 +413,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_42Ejxtw3ANOc7Z","request_duration_ms":1127}}' + - '{"last_request_metrics":{"request_id":"req_D4cdH7OWLVrSRp","request_duration_ms":1023}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -430,7 +430,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:27 GMT + - Tue, 23 Apr 2024 11:19:09 GMT Content-Type: - application/json Content-Length: @@ -462,7 +462,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_GwCDbtlfFx98Ca + - req_7fET0Vsy8rlAB3 Stripe-Version: - '2024-04-10' Vary: @@ -475,7 +475,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7VKuuB1fWySn2XHLMoF9", + "id": "pi_3P8hNPKuuB1fWySn1YmwOcGM", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -491,18 +491,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393505, + "created": 1713871147, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7VKuuB1fWySn28tKnIYE", + "latest_charge": "ch_3P8hNPKuuB1fWySn186LYHZO", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7VKuuB1fWySnsX7ucKLX", + "payment_method": "pm_1P8hNPKuuB1fWySnDHy6ZIyV", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -527,10 +527,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:27 GMT + recorded_at: Tue, 23 Apr 2024 11:19:09 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7VKuuB1fWySn2XHLMoF9/capture + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNPKuuB1fWySn1YmwOcGM/capture body: encoding: US-ASCII string: '' @@ -542,7 +542,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_GwCDbtlfFx98Ca","request_duration_ms":406}}' + - '{"last_request_metrics":{"request_id":"req_7fET0Vsy8rlAB3","request_duration_ms":300}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -559,7 +559,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:28 GMT + - Tue, 23 Apr 2024 11:19:10 GMT Content-Type: - application/json Content-Length: @@ -587,15 +587,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - e31e1c73-e6ea-4709-aac2-6b25bfbd32bd + - d06e3f1f-3dd3-4e42-9b79-adc58e38f5bd Original-Request: - - req_FFdCC8GBHe6yzl + - req_nd5bj5GUQrrWz3 Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_FFdCC8GBHe6yzl + - req_nd5bj5GUQrrWz3 Stripe-Should-Retry: - 'false' Stripe-Version: @@ -610,7 +610,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7VKuuB1fWySn2XHLMoF9", + "id": "pi_3P8hNPKuuB1fWySn1YmwOcGM", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -626,18 +626,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393505, + "created": 1713871147, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7VKuuB1fWySn28tKnIYE", + "latest_charge": "ch_3P8hNPKuuB1fWySn186LYHZO", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7VKuuB1fWySnsX7ucKLX", + "payment_method": "pm_1P8hNPKuuB1fWySnDHy6ZIyV", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -662,10 +662,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:28 GMT + recorded_at: Tue, 23 Apr 2024 11:19:10 GMT - request: method: get - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7VKuuB1fWySn2XHLMoF9 + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNPKuuB1fWySn1YmwOcGM body: encoding: US-ASCII string: '' @@ -677,7 +677,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_FFdCC8GBHe6yzl","request_duration_ms":1124}}' + - '{"last_request_metrics":{"request_id":"req_nd5bj5GUQrrWz3","request_duration_ms":910}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -694,7 +694,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:29 GMT + - Tue, 23 Apr 2024 11:19:10 GMT Content-Type: - application/json Content-Length: @@ -726,7 +726,7 @@ http_interactions: Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_VCkHzjjHMXrfND + - req_nTq52MOanuOx3G Stripe-Version: - '2024-04-10' Vary: @@ -739,7 +739,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7VKuuB1fWySn2XHLMoF9", + "id": "pi_3P8hNPKuuB1fWySn1YmwOcGM", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -755,18 +755,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393505, + "created": 1713871147, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7VKuuB1fWySn28tKnIYE", + "latest_charge": "ch_3P8hNPKuuB1fWySn186LYHZO", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7VKuuB1fWySnsX7ucKLX", + "payment_method": "pm_1P8hNPKuuB1fWySnDHy6ZIyV", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -791,5 +791,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:29 GMT + recorded_at: Tue, 23 Apr 2024 11:19:10 GMT recorded_with: VCR 6.2.0 diff --git a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/returns_payment_intent_id_and_does_not_raise.yml b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/returns_payment_intent_id_and_does_not_raise.yml similarity index 88% rename from spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/returns_payment_intent_id_and_does_not_raise.yml rename to spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/returns_payment_intent_id_and_does_not_raise.yml index 0ed7d06d49d..0492deb9ffe 100644 --- a/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/returns_payment_intent_id_and_does_not_raise.yml +++ b/spec/fixtures/vcr_cassettes/Stripe-v11.1.0/Stripe_PaymentIntentValidator/_call/as_a_guest/when_payment_intent_is_valid/valid_non-3D_credit_cards_are_correctly_handled/behaves_like_payments_intents/from_Visa_debit_/returns_payment_intent_id_and_does_not_raise.yml @@ -14,7 +14,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_tfIcynbnVwUvuZ","request_duration_ms":406}}' + - '{"last_request_metrics":{"request_id":"req_xP6oHQTgDjlOHG","request_duration_ms":406}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -31,7 +31,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:23 GMT + - Tue, 23 Apr 2024 11:19:05 GMT Content-Type: - application/json Content-Length: @@ -58,15 +58,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - a7b996f1-a409-4a18-aa1b-1880b0a5034e + - 7f78fc1e-c46a-4874-a1f6-16c601cbf2b3 Original-Request: - - req_bkXwpvWqb1uGih + - req_yHsbyvzodoQCdC Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_bkXwpvWqb1uGih + - req_yHsbyvzodoQCdC Stripe-Should-Retry: - 'false' Stripe-Version: @@ -81,7 +81,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pm_1P6h7TKuuB1fWySnjAMDCuUb", + "id": "pm_1P8hNMKuuB1fWySnJvGqdDRh", "object": "payment_method", "allow_redisplay": "unspecified", "billing_details": { @@ -123,19 +123,19 @@ http_interactions: }, "wallet": null }, - "created": 1713393503, + "created": 1713871145, "customer": null, "livemode": false, "metadata": {}, "type": "card" } - recorded_at: Wed, 17 Apr 2024 22:38:23 GMT + recorded_at: Tue, 23 Apr 2024 11:19:05 GMT - request: method: post uri: https://api.stripe.com/v1/payment_intents body: encoding: UTF-8 - string: amount=100¤cy=eur&payment_method=pm_1P6h7TKuuB1fWySnjAMDCuUb&payment_method_types[0]=card&capture_method=manual + string: amount=100¤cy=eur&payment_method=pm_1P8hNMKuuB1fWySnJvGqdDRh&payment_method_types[0]=card&capture_method=manual headers: User-Agent: - Stripe/v1 RubyBindings/11.1.0 @@ -144,7 +144,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_bkXwpvWqb1uGih","request_duration_ms":573}}' + - '{"last_request_metrics":{"request_id":"req_yHsbyvzodoQCdC","request_duration_ms":470}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -161,7 +161,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:24 GMT + - Tue, 23 Apr 2024 11:19:05 GMT Content-Type: - application/json Content-Length: @@ -188,15 +188,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - 554816c3-59e5-4e14-ae85-c157106cfeb6 + - d1d3e86b-bd89-40f7-bc01-f7970fe43035 Original-Request: - - req_F5w6Gb6QlfUAzd + - req_57mU7XA1FJSVyr Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_F5w6Gb6QlfUAzd + - req_57mU7XA1FJSVyr Stripe-Should-Retry: - 'false' Stripe-Version: @@ -211,7 +211,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7TKuuB1fWySn2fA3dJIq", + "id": "pi_3P8hNNKuuB1fWySn2R30XK1N", "object": "payment_intent", "amount": 100, "amount_capturable": 0, @@ -227,7 +227,7 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393503, + "created": 1713871145, "currency": "eur", "customer": null, "description": null, @@ -238,7 +238,7 @@ http_interactions: "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7TKuuB1fWySnjAMDCuUb", + "payment_method": "pm_1P8hNMKuuB1fWySnJvGqdDRh", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -263,10 +263,10 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:24 GMT + recorded_at: Tue, 23 Apr 2024 11:19:05 GMT - request: method: post - uri: https://api.stripe.com/v1/payment_intents/pi_3P6h7TKuuB1fWySn2fA3dJIq/confirm + uri: https://api.stripe.com/v1/payment_intents/pi_3P8hNNKuuB1fWySn2R30XK1N/confirm body: encoding: US-ASCII string: '' @@ -278,7 +278,7 @@ http_interactions: Content-Type: - application/x-www-form-urlencoded X-Stripe-Client-Telemetry: - - '{"last_request_metrics":{"request_id":"req_F5w6Gb6QlfUAzd","request_duration_ms":507}}' + - '{"last_request_metrics":{"request_id":"req_57mU7XA1FJSVyr","request_duration_ms":384}}' Stripe-Version: - '2024-04-10' X-Stripe-Client-User-Agent: @@ -295,7 +295,7 @@ http_interactions: Server: - nginx Date: - - Wed, 17 Apr 2024 22:38:25 GMT + - Tue, 23 Apr 2024 11:19:06 GMT Content-Type: - application/json Content-Length: @@ -323,15 +323,15 @@ http_interactions: Cross-Origin-Opener-Policy-Report-Only: - same-origin; report-to="coop" Idempotency-Key: - - '089dc653-e311-418b-a775-17489143e1dd' + - 0d1579d0-f113-42f9-9f65-5445ea4ec037 Original-Request: - - req_pXfL18SxvJbCBU + - req_qzjFSWd3iBDt8c Report-To: - '{"group":"coop","max_age":8640,"endpoints":[{"url":"https://q.stripe.com/coop-report"}],"include_subdomains":true}' Reporting-Endpoints: - coop="https://q.stripe.com/coop-report" Request-Id: - - req_pXfL18SxvJbCBU + - req_qzjFSWd3iBDt8c Stripe-Should-Retry: - 'false' Stripe-Version: @@ -346,7 +346,7 @@ http_interactions: encoding: UTF-8 string: |- { - "id": "pi_3P6h7TKuuB1fWySn2fA3dJIq", + "id": "pi_3P8hNNKuuB1fWySn2R30XK1N", "object": "payment_intent", "amount": 100, "amount_capturable": 100, @@ -362,18 +362,18 @@ http_interactions: "capture_method": "manual", "client_secret": "", "confirmation_method": "automatic", - "created": 1713393503, + "created": 1713871145, "currency": "eur", "customer": null, "description": null, "invoice": null, "last_payment_error": null, - "latest_charge": "ch_3P6h7TKuuB1fWySn2rsh6FhI", + "latest_charge": "ch_3P8hNNKuuB1fWySn2UVLjbTL", "livemode": false, "metadata": {}, "next_action": null, "on_behalf_of": null, - "payment_method": "pm_1P6h7TKuuB1fWySnjAMDCuUb", + "payment_method": "pm_1P8hNMKuuB1fWySnJvGqdDRh", "payment_method_configuration_details": null, "payment_method_options": { "card": { @@ -398,5 +398,5 @@ http_interactions: "transfer_data": null, "transfer_group": null } - recorded_at: Wed, 17 Apr 2024 22:38:25 GMT + recorded_at: Tue, 23 Apr 2024 11:19:06 GMT recorded_with: VCR 6.2.0 diff --git a/spec/forms/enterprise_fees_bulk_update_spec.rb b/spec/forms/enterprise_fees_bulk_update_spec.rb index 1ec22a8c8e6..2fcd1a854f6 100644 --- a/spec/forms/enterprise_fees_bulk_update_spec.rb +++ b/spec/forms/enterprise_fees_bulk_update_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe EnterpriseFeesBulkUpdate do +RSpec.describe EnterpriseFeesBulkUpdate do describe "error reporting" do let(:enterprise_fee) { build_stubbed(:enterprise_fee) } let(:base_attributes) do diff --git a/spec/helpers/admin/enterprises_helper_spec.rb b/spec/helpers/admin/enterprises_helper_spec.rb index e7683a12b3a..58131fdf06c 100644 --- a/spec/helpers/admin/enterprises_helper_spec.rb +++ b/spec/helpers/admin/enterprises_helper_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Admin::EnterprisesHelper, type: :helper do +RSpec.describe Admin::EnterprisesHelper, type: :helper do let(:user) { build(:user) } before do diff --git a/spec/helpers/admin/orders_helper_spec.rb b/spec/helpers/admin/orders_helper_spec.rb index ff00b73dc78..c24f92c471b 100644 --- a/spec/helpers/admin/orders_helper_spec.rb +++ b/spec/helpers/admin/orders_helper_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Admin::OrdersHelper, type: :helper do +RSpec.describe Admin::OrdersHelper, type: :helper do describe "#order_adjustments_for_display" do let(:order) { create(:order) } let(:service) { instance_double(VoucherAdjustmentsService, voucher_included_tax:) } @@ -55,5 +55,56 @@ expect(fake_adjustment.amount).to eq(-0.5) end end + + context "with additional tax total" do + let!(:shipping_method){ create(:free_shipping_method) } + let!(:enterprise){ + create(:distributor_enterprise_with_tax, name: 'Enterprise', charges_sales_tax: true, + shipping_methods: [shipping_method]) + } + let!(:country_zone){ create(:zone_with_member) } + let!(:tax_category){ create(:tax_category, name: 'tax_category') } + let!(:tax_rate){ + create(:tax_rate, zone: country_zone, tax_category:, name: 'Tax Rate', amount: 0.13, + included_in_price: false) + } + let!(:ship_address){ create(:ship_address) } + let!(:product) { + create(:simple_product, supplier: enterprise, price: 10, tax_category_id: tax_category.id) + } + let!(:variant){ + create(:variant, :with_order_cycle, product:, distributor: enterprise, order_cycle:, + tax_category:) + } + let!(:coordinator_fees){ + create(:enterprise_fee, :flat_percent_per_item, enterprise:, amount: 20, + name: 'Adminstration', + fee_type: 'sales', + tax_category:) + } + let!(:order_cycle){ + create(:simple_order_cycle, name: "oc1", suppliers: [enterprise], + distributors: [enterprise], + coordinator_fees: [coordinator_fees]) + } + let!(:order){ + create(:order_with_distributor, distributor: enterprise, order_cycle:, ship_address:) + } + let!(:line_item) { create(:line_item, variant:, quantity: 1, price: 10, order:) } + + before do + order_cycle.variants << [product.variants.first] + order_cycle.exchanges.outgoing.first.variants << product.variants.first + + order.recreate_all_fees! + Orders::WorkflowService.new(order).complete! + end + + it "includes additional tax on fees" do + adjustment = order_adjustments_for_display(order).first + expect(adjustment.label).to eq("Tax on fees") + expect(adjustment.amount).to eq(0.26) + end + end end end diff --git a/spec/helpers/admin/reports_helper_spec.rb b/spec/helpers/admin/reports_helper_spec.rb index 9ea424bc48f..0cd63d9037d 100644 --- a/spec/helpers/admin/reports_helper_spec.rb +++ b/spec/helpers/admin/reports_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ReportsHelper, type: :helper do +RSpec.describe ReportsHelper, type: :helper do describe "#report_payment_method_options" do let(:order_with_payments) { create(:order_ready_to_ship) } let(:order_without_payments) { create(:order_with_line_items) } diff --git a/spec/helpers/admin/subscriptions_helper_spec.rb b/spec/helpers/admin/subscriptions_helper_spec.rb index dec9c2d6af2..f4dc888ab39 100644 --- a/spec/helpers/admin/subscriptions_helper_spec.rb +++ b/spec/helpers/admin/subscriptions_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Admin::SubscriptionsHelper, type: :helper do +RSpec.describe Admin::SubscriptionsHelper, type: :helper do describe "checking if setup is complete for any [shop]" do let(:shop) { create(:distributor_enterprise) } let(:customer) { create(:customer, enterprise: shop) } diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index c13cdf44f0f..c9aa5c7b0db 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ApplicationHelper, type: :helper do +RSpec.describe ApplicationHelper, type: :helper do describe "#feature?" do it "takes several actors" do user = Spree::User.new(id: 4) diff --git a/spec/helpers/bulk_form_builder_spec.rb b/spec/helpers/bulk_form_builder_spec.rb index 2c1bbc23c71..6400d8b2212 100644 --- a/spec/helpers/bulk_form_builder_spec.rb +++ b/spec/helpers/bulk_form_builder_spec.rb @@ -4,7 +4,7 @@ class TestHelper < ActionView::Base; end -describe BulkFormBuilder do +RSpec.describe BulkFormBuilder do describe '#text_field' do let(:product) { create(:product) } let(:form) { BulkFormBuilder.new(:product, product, self, {}) } diff --git a/spec/helpers/checkout_helper_spec.rb b/spec/helpers/checkout_helper_spec.rb index 9aae5df87a1..a6f8350a247 100644 --- a/spec/helpers/checkout_helper_spec.rb +++ b/spec/helpers/checkout_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe CheckoutHelper, type: :helper do +RSpec.describe CheckoutHelper, type: :helper do it "generates html for validated inputs" do expect(helper).to receive(:render).with( "shared/validated_input", diff --git a/spec/helpers/i18n_helper_spec.rb b/spec/helpers/i18n_helper_spec.rb index a4117097d43..d8434d228c1 100644 --- a/spec/helpers/i18n_helper_spec.rb +++ b/spec/helpers/i18n_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe I18nHelper, type: :helper do +RSpec.describe I18nHelper, type: :helper do let(:user) { create(:user) } let(:cookies) { {} } diff --git a/spec/helpers/injection_helper_spec.rb b/spec/helpers/injection_helper_spec.rb index 1c355a5577f..d7cc6609517 100644 --- a/spec/helpers/injection_helper_spec.rb +++ b/spec/helpers/injection_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe InjectionHelper, type: :helper do +RSpec.describe InjectionHelper, type: :helper do let!(:enterprise) { create(:distributor_enterprise, facebook: "roger") } let!(:distributor1) { create(:distributor_enterprise) } diff --git a/spec/helpers/link_helper_spec.rb b/spec/helpers/link_helper_spec.rb index 6632df99285..cf7c6a07c53 100644 --- a/spec/helpers/link_helper_spec.rb +++ b/spec/helpers/link_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe LinkHelper, type: :helper do +RSpec.describe LinkHelper, type: :helper do describe "ext_url" do it "adds prefix if missing" do expect(helper.ext_url("http://example.com/", "http://example.com/bla")).to eq("http://example.com/bla") diff --git a/spec/helpers/map_helper_spec.rb b/spec/helpers/map_helper_spec.rb new file mode 100644 index 00000000000..a75921a1b1b --- /dev/null +++ b/spec/helpers/map_helper_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: false + +require 'spec_helper' + +RSpec.describe MapHelper do + describe "#using_google_maps?" do + it "returns true when a GOOGLE_MAPS_API_KEY is present" do + stub_environment_variable("GOOGLE_MAPS_API_KEY", "ABC") + + expect(helper.using_google_maps?).to eq true + end + + it "returns false if Open Street Map is enabled, even if a GOOGLE_MAPS_API_KEY is present" do + stub_environment_variable("GOOGLE_MAPS_API_KEY", "ABC") + ContentConfig.open_street_map_enabled = true + + expect(helper.using_google_maps?).to eq false + end + end + + private + + def stub_environment_variable(key, value) + allow(ENV).to receive(:[]).and_call_original # Allow non-stubbed calls to ENV to proceed + allow(ENV).to receive(:[]).with(key).and_return(value) + end +end diff --git a/spec/helpers/navigation_helper_spec.rb b/spec/helpers/navigation_helper_spec.rb index ee01b3204a3..e5a9a40c006 100644 --- a/spec/helpers/navigation_helper_spec.rb +++ b/spec/helpers/navigation_helper_spec.rb @@ -4,7 +4,7 @@ module Spree module Admin - describe NavigationHelper, type: :helper do + RSpec.describe NavigationHelper, type: :helper do describe "klass_for" do it "returns the class when present" do expect(helper.klass_for('products')).to eq(Spree::Product) diff --git a/spec/helpers/order_cycles_helper_spec.rb b/spec/helpers/order_cycles_helper_spec.rb index 443556be843..cb7a7d1151d 100644 --- a/spec/helpers/order_cycles_helper_spec.rb +++ b/spec/helpers/order_cycles_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderCyclesHelper, type: :helper do +RSpec.describe OrderCyclesHelper, type: :helper do let(:oc) { double(:order_cycle) } describe "finding producer enterprise options" do diff --git a/spec/helpers/serializer_helper_spec.rb b/spec/helpers/serializer_helper_spec.rb index 6ba9589abeb..911515a7c3c 100644 --- a/spec/helpers/serializer_helper_spec.rb +++ b/spec/helpers/serializer_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe SerializerHelper, type: :helper do +RSpec.describe SerializerHelper, type: :helper do let(:serializer) do Class.new(ActiveModel::Serializer) do attributes :id, :name diff --git a/spec/helpers/shop_helper_spec.rb b/spec/helpers/shop_helper_spec.rb index 1c0bd4df7b7..e59881d6ef8 100644 --- a/spec/helpers/shop_helper_spec.rb +++ b/spec/helpers/shop_helper_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: false require 'spec_helper' -describe ShopHelper, type: :helper do +RSpec.describe ShopHelper, type: :helper do describe "shop_tabs" do context "distributor with groups" do let(:group) { create(:enterprise_group) } diff --git a/spec/helpers/spree/admin/base_helper_spec.rb b/spec/helpers/spree/admin/base_helper_spec.rb index 8930d83d5ac..958f7f2ae18 100644 --- a/spec/helpers/spree/admin/base_helper_spec.rb +++ b/spec/helpers/spree/admin/base_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::BaseHelper, type: :helper do +RSpec.describe Spree::Admin::BaseHelper, type: :helper do helper 'spree/admin/navigation' describe "#link_to_remove_fields" do diff --git a/spec/helpers/spree/admin/general_settings_helper_spec.rb b/spec/helpers/spree/admin/general_settings_helper_spec.rb index b63d7c8cdce..c5713c6dec0 100644 --- a/spec/helpers/spree/admin/general_settings_helper_spec.rb +++ b/spec/helpers/spree/admin/general_settings_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::GeneralSettingsHelper, type: :helper do +RSpec.describe Spree::Admin::GeneralSettingsHelper, type: :helper do describe "#all_units" do it "returns all units" do expect(helper.all_units).to eq(["mg", "g", "kg", "T", "oz", "lb", "mL", "cL", "dL", "L", diff --git a/spec/helpers/spree/admin/orders_helper_spec.rb b/spec/helpers/spree/admin/orders_helper_spec.rb index 07b5a10f7c6..b759df39c9f 100644 --- a/spec/helpers/spree/admin/orders_helper_spec.rb +++ b/spec/helpers/spree/admin/orders_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Admin::OrdersHelper, type: :helper do +RSpec.describe Spree::Admin::OrdersHelper, type: :helper do describe "#orders_links" do let(:order) { double(:order) } let(:distributor) { double(:enterprise) } diff --git a/spec/helpers/spree/base_helper_spec.rb b/spec/helpers/spree/base_helper_spec.rb index 54d965f1cfe..35511de2bef 100644 --- a/spec/helpers/spree/base_helper_spec.rb +++ b/spec/helpers/spree/base_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::BaseHelper do +RSpec.describe Spree::BaseHelper do include Spree::BaseHelper context "available_countries" do diff --git a/spec/helpers/spree/orders_helper_spec.rb b/spec/helpers/spree/orders_helper_spec.rb index a44bd9afabd..a74ce38e9e5 100644 --- a/spec/helpers/spree/orders_helper_spec.rb +++ b/spec/helpers/spree/orders_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::OrdersHelper, type: :helper do +RSpec.describe Spree::OrdersHelper, type: :helper do describe "#changeable_orders" do let(:complete_orders) { double(:complete_orders, where: "some_orders") } diff --git a/spec/helpers/tax_helper_spec.rb b/spec/helpers/tax_helper_spec.rb index ed878643904..2d262d8486e 100644 --- a/spec/helpers/tax_helper_spec.rb +++ b/spec/helpers/tax_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe TaxHelper, type: :helper do +RSpec.describe TaxHelper, type: :helper do let(:line_item) { create(:line_item) } let(:line_item2) { create(:line_item) } let(:line_item3) { create(:line_item) } diff --git a/spec/helpers/terms_and_conditions_helper_spec.rb b/spec/helpers/terms_and_conditions_helper_spec.rb index 320426ea51c..100fc3e80d2 100644 --- a/spec/helpers/terms_and_conditions_helper_spec.rb +++ b/spec/helpers/terms_and_conditions_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe TermsAndConditionsHelper, type: :helper do +RSpec.describe TermsAndConditionsHelper, type: :helper do describe "#platform_terms_required?" do context 'when ToS file is present' do before do diff --git a/spec/javascripts/stimulus/bulk_form_controller_test.js b/spec/javascripts/stimulus/bulk_form_controller_test.js index 82d83c72712..2f1e8ea429e 100644 --- a/spec/javascripts/stimulus/bulk_form_controller_test.js +++ b/spec/javascripts/stimulus/bulk_form_controller_test.js @@ -99,6 +99,59 @@ describe("BulkFormController", () => { expect(input1b.classList).not.toContain('changed'); expect(input2.classList).toContain('changed'); }); + + describe("select not include_blank", () => { + beforeEach(() => { + document.body.innerHTML = ` +
+
+ +
+ +
+ `; + }); + + it("shows as changed", () => { + // Expect select to show changed (select-one always has something selected) + expect(select1.classList).toContain('changed'); + + // Change selection + select1.options[0].selected = false; + select1.options[1].selected = true; + select1.dispatchEvent(new Event("input")); + expect(select1.classList).toContain('changed'); + }); + }); + + describe("select-one with include_blank", () => { + beforeEach(() => { + document.body.innerHTML = ` +
+
+ +
+ +
+ `; + }); + + it("does not show as changed", () => { + expect(select1.classList).not.toContain('changed'); + + // Change selection + select1.options[0].selected = false; + select1.options[1].selected = true; + select1.dispatchEvent(new Event("input")); + expect(select1.classList).toContain('changed'); + }); + }); }) describe("activating sections, and showing a summary", () => { diff --git a/spec/jobs/bulk_invoice_job_spec.rb b/spec/jobs/bulk_invoice_job_spec.rb index 907749033c7..3d8e1370934 100644 --- a/spec/jobs/bulk_invoice_job_spec.rb +++ b/spec/jobs/bulk_invoice_job_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe BulkInvoiceJob do +RSpec.describe BulkInvoiceJob do subject { BulkInvoiceJob.new(order_ids, "/tmp/file/path") } context "when invoices are enabled", feature: :invoices do diff --git a/spec/jobs/heartbeat_job_spec.rb b/spec/jobs/heartbeat_job_spec.rb index d60aa23b31a..933e9cd456b 100644 --- a/spec/jobs/heartbeat_job_spec.rb +++ b/spec/jobs/heartbeat_job_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe HeartbeatJob do +RSpec.describe HeartbeatJob do context "with time frozen" do let(:run_time) { Time.zone.local(2016, 4, 13, 13, 0, 0) } diff --git a/spec/jobs/job_logger_spec.rb b/spec/jobs/job_logger_spec.rb index de7a12c9461..7d93868ef5c 100644 --- a/spec/jobs/job_logger_spec.rb +++ b/spec/jobs/job_logger_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe JobLogger do +RSpec.describe JobLogger do describe '.logger' do it "returns a Ruby's logger instance" do expect(JobLogger.logger).to respond_to(:info) diff --git a/spec/jobs/order_cycle_closing_job_spec.rb b/spec/jobs/order_cycle_closing_job_spec.rb index 33be226c243..dc1f7ce23d1 100644 --- a/spec/jobs/order_cycle_closing_job_spec.rb +++ b/spec/jobs/order_cycle_closing_job_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderCycleClosingJob do +RSpec.describe OrderCycleClosingJob do let(:order_cycle1) { create(:order_cycle, automatic_notifications: true, orders_close_at: 1.minute.ago) } diff --git a/spec/jobs/order_cycle_notification_job_spec.rb b/spec/jobs/order_cycle_notification_job_spec.rb index 233beac26b6..f8496fc86c0 100644 --- a/spec/jobs/order_cycle_notification_job_spec.rb +++ b/spec/jobs/order_cycle_notification_job_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderCycleNotificationJob do +RSpec.describe OrderCycleNotificationJob do let(:order_cycle) { create(:order_cycle) } let(:mail) { double(:mail, deliver_now: true) } diff --git a/spec/jobs/order_cycle_opened_job_spec.rb b/spec/jobs/order_cycle_opened_job_spec.rb index b0ebfbe927a..caf5ee6ef10 100644 --- a/spec/jobs/order_cycle_opened_job_spec.rb +++ b/spec/jobs/order_cycle_opened_job_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderCycleOpenedJob do +RSpec.describe OrderCycleOpenedJob do let(:oc_opened_before) { create(:order_cycle, orders_open_at: 1.hour.ago) } diff --git a/spec/jobs/report_job_spec.rb b/spec/jobs/report_job_spec.rb index 399cbcbbb6b..e1ce4a1a561 100644 --- a/spec/jobs/report_job_spec.rb +++ b/spec/jobs/report_job_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ReportJob do +RSpec.describe ReportJob do include CableReady::Broadcaster let(:report_args) { diff --git a/spec/jobs/subscription_confirm_job_spec.rb b/spec/jobs/subscription_confirm_job_spec.rb index d5cf92c40cb..bdad78a5a94 100644 --- a/spec/jobs/subscription_confirm_job_spec.rb +++ b/spec/jobs/subscription_confirm_job_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe SubscriptionConfirmJob do +RSpec.describe SubscriptionConfirmJob do let(:job) { SubscriptionConfirmJob.new } describe "finding proxy_orders that are ready to be confirmed" do diff --git a/spec/jobs/subscription_placement_job_spec.rb b/spec/jobs/subscription_placement_job_spec.rb index c6bb6c232bd..26c7093c31c 100644 --- a/spec/jobs/subscription_placement_job_spec.rb +++ b/spec/jobs/subscription_placement_job_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe SubscriptionPlacementJob do +RSpec.describe SubscriptionPlacementJob do include ActiveSupport::Testing::TimeHelpers let(:job) { SubscriptionPlacementJob.new } diff --git a/spec/jobs/webhook_delivery_job_spec.rb b/spec/jobs/webhook_delivery_job_spec.rb index 14c7367d3a0..0b09ed7bde5 100644 --- a/spec/jobs/webhook_delivery_job_spec.rb +++ b/spec/jobs/webhook_delivery_job_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe WebhookDeliveryJob do +RSpec.describe WebhookDeliveryJob do subject { WebhookDeliveryJob.new(url, event, data) } let(:url) { 'https://test/endpoint' } let(:event) { 'order_cycle.opened' } diff --git a/spec/lib/action_dispatch/request_spec.rb b/spec/lib/action_dispatch/request_spec.rb index 59caf701cba..8ab68abc4cb 100644 --- a/spec/lib/action_dispatch/request_spec.rb +++ b/spec/lib/action_dispatch/request_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ActionDispatch::Request do +RSpec.describe ActionDispatch::Request do it "strips nils from arrays" do expect(parse_query_parameters('key[]=value&key[]')).to eq({ "key" => ["value"] }) end diff --git a/spec/lib/haml_up_spec.rb b/spec/lib/haml_up_spec.rb index 0df7c56642b..f78b95017ad 100644 --- a/spec/lib/haml_up_spec.rb +++ b/spec/lib/haml_up_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'haml_up' -describe HamlUp, skip: !Gem::Dependency.new("", "~> 5.2").match?("", Haml::VERSION) do +RSpec.describe HamlUp, skip: !Gem::Dependency.new("", "~> 5.2").match?("", Haml::VERSION) do describe "#rewrite_template" do it "preserves a simple template" do original = "%p This is a paragraph" diff --git a/spec/lib/i18n_digests_spec.rb b/spec/lib/i18n_digests_spec.rb index 391cbb0050b..6dd321c98b5 100644 --- a/spec/lib/i18n_digests_spec.rb +++ b/spec/lib/i18n_digests_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe I18nDigests do +RSpec.describe I18nDigests do describe "#build_digests" do let(:available_locales) { ["en", "es"] } let(:md5_hex_regex) { /([a-f0-9]){10}/ } diff --git a/spec/lib/open_food_network/address_finder_spec.rb b/spec/lib/open_food_network/address_finder_spec.rb index 1f11b57b41d..499f7dff865 100644 --- a/spec/lib/open_food_network/address_finder_spec.rb +++ b/spec/lib/open_food_network/address_finder_spec.rb @@ -4,7 +4,7 @@ require 'open_food_network/address_finder' module OpenFoodNetwork - describe AddressFinder do + RSpec.describe AddressFinder do let(:email) { 'test@example.com' } describe "initialisation" do diff --git a/spec/lib/open_food_network/enterprise_fee_applicator_spec.rb b/spec/lib/open_food_network/enterprise_fee_applicator_spec.rb index 94c0b46b17e..98f7db2325e 100644 --- a/spec/lib/open_food_network/enterprise_fee_applicator_spec.rb +++ b/spec/lib/open_food_network/enterprise_fee_applicator_spec.rb @@ -4,7 +4,7 @@ require 'open_food_network/enterprise_fee_applicator' module OpenFoodNetwork - describe EnterpriseFeeApplicator do + RSpec.describe EnterpriseFeeApplicator do let(:line_item) { create(:line_item, variant: target_variant) } let(:inherits_tax) { true } let(:enterprise_fee) { diff --git a/spec/lib/open_food_network/enterprise_fee_calculator_spec.rb b/spec/lib/open_food_network/enterprise_fee_calculator_spec.rb index 78f23deb729..29f96c231aa 100644 --- a/spec/lib/open_food_network/enterprise_fee_calculator_spec.rb +++ b/spec/lib/open_food_network/enterprise_fee_calculator_spec.rb @@ -4,7 +4,7 @@ require 'open_food_network/enterprise_fee_calculator' module OpenFoodNetwork - describe EnterpriseFeeCalculator do + RSpec.describe EnterpriseFeeCalculator do describe "integration" do let(:supplier1) { create(:supplier_enterprise) } let(:supplier2) { create(:supplier_enterprise) } diff --git a/spec/lib/open_food_network/enterprise_issue_validator_spec.rb b/spec/lib/open_food_network/enterprise_issue_validator_spec.rb index 8630dfcd364..879282cf9db 100644 --- a/spec/lib/open_food_network/enterprise_issue_validator_spec.rb +++ b/spec/lib/open_food_network/enterprise_issue_validator_spec.rb @@ -4,7 +4,7 @@ require 'open_food_network/enterprise_issue_validator' module OpenFoodNetwork - describe EnterpriseIssueValidator do + RSpec.describe EnterpriseIssueValidator do describe "warnings" do let(:enterprise_invisible) { create(:enterprise, visible: "only_through_links") } let(:warnings) { EnterpriseIssueValidator.new(enterprise_invisible).warnings } diff --git a/spec/lib/open_food_network/error_logger_spec.rb b/spec/lib/open_food_network/error_logger_spec.rb index 88afdeede24..a2335ee1d97 100644 --- a/spec/lib/open_food_network/error_logger_spec.rb +++ b/spec/lib/open_food_network/error_logger_spec.rb @@ -4,7 +4,7 @@ require 'open_food_network/error_logger' module OpenFoodNetwork - describe ErrorLogger do + RSpec.describe ErrorLogger do let(:error) { StandardError.new("Test") } it "notifies Bugsnag" do diff --git a/spec/lib/open_food_network/feature_toggle_spec.rb b/spec/lib/open_food_network/feature_toggle_spec.rb index 9c9861257a1..9d185a8fc6c 100644 --- a/spec/lib/open_food_network/feature_toggle_spec.rb +++ b/spec/lib/open_food_network/feature_toggle_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OpenFoodNetwork::FeatureToggle do +RSpec.describe OpenFoodNetwork::FeatureToggle do subject(:feature_toggle) { OpenFoodNetwork::FeatureToggle } describe ".enabled?" do diff --git a/spec/lib/open_food_network/i18n_config_spec.rb b/spec/lib/open_food_network/i18n_config_spec.rb index b69aa8b745f..210be7e6124 100644 --- a/spec/lib/open_food_network/i18n_config_spec.rb +++ b/spec/lib/open_food_network/i18n_config_spec.rb @@ -4,7 +4,7 @@ require 'open_food_network/i18n_config' module OpenFoodNetwork - describe I18nConfig do + RSpec.describe I18nConfig do before do # Allow non-stubbed calls to ENV to proceed allow(ENV).to receive(:[]).and_call_original diff --git a/spec/lib/open_food_network/i18n_inflections_spec.rb b/spec/lib/open_food_network/i18n_inflections_spec.rb index 2d8bc25d226..70af2719d26 100644 --- a/spec/lib/open_food_network/i18n_inflections_spec.rb +++ b/spec/lib/open_food_network/i18n_inflections_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'open_food_network/i18n_inflections' -describe OpenFoodNetwork::I18nInflections do +RSpec.describe OpenFoodNetwork::I18nInflections do let(:subject) { described_class } it "returns the same word if no plural is known" do diff --git a/spec/lib/open_food_network/order_cycle_form_applicator_spec.rb b/spec/lib/open_food_network/order_cycle_form_applicator_spec.rb index 96314aa674e..e12cd9c6a93 100644 --- a/spec/lib/open_food_network/order_cycle_form_applicator_spec.rb +++ b/spec/lib/open_food_network/order_cycle_form_applicator_spec.rb @@ -5,7 +5,7 @@ require 'open_food_network/order_cycle_form_applicator' module OpenFoodNetwork - describe OrderCycleFormApplicator do + RSpec.describe OrderCycleFormApplicator do let!(:user) { create(:user) } context "unit specs" do diff --git a/spec/lib/open_food_network/order_cycle_permissions_spec.rb b/spec/lib/open_food_network/order_cycle_permissions_spec.rb index d7d3f93c40e..72a9ada9e51 100644 --- a/spec/lib/open_food_network/order_cycle_permissions_spec.rb +++ b/spec/lib/open_food_network/order_cycle_permissions_spec.rb @@ -4,7 +4,7 @@ require 'open_food_network/order_cycle_permissions' module OpenFoodNetwork - describe OrderCyclePermissions do + RSpec.describe OrderCyclePermissions do let(:coordinator) { create(:distributor_enterprise) } let(:hub) { create(:distributor_enterprise) } let(:producer) { create(:supplier_enterprise) } diff --git a/spec/lib/open_food_network/permissions_spec.rb b/spec/lib/open_food_network/permissions_spec.rb index 0f216a90d15..457b1fd98f6 100644 --- a/spec/lib/open_food_network/permissions_spec.rb +++ b/spec/lib/open_food_network/permissions_spec.rb @@ -4,7 +4,7 @@ require 'open_food_network/permissions' module OpenFoodNetwork - describe Permissions do + RSpec.describe Permissions do let(:user) { double(:user) } let(:permissions) { Permissions.new(user) } let(:permission) { 'one' } diff --git a/spec/lib/open_food_network/property_merge_spec.rb b/spec/lib/open_food_network/property_merge_spec.rb index 6ab1dbd55d8..1fd6ef8a747 100644 --- a/spec/lib/open_food_network/property_merge_spec.rb +++ b/spec/lib/open_food_network/property_merge_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module OpenFoodNetwork - describe PropertyMerge do + RSpec.describe PropertyMerge do let(:property) { create(:property, presentation: 'One') } let(:duplicate_property) { create(:property, presentation: 'One') } let(:different_property) { create(:property, presentation: 'Two') } diff --git a/spec/lib/open_food_network/referer_parser_spec.rb b/spec/lib/open_food_network/referer_parser_spec.rb index b3a0ceaed3b..98dd0f4deb4 100644 --- a/spec/lib/open_food_network/referer_parser_spec.rb +++ b/spec/lib/open_food_network/referer_parser_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' module OpenFoodNetwork - describe RefererParser do + RSpec.describe RefererParser do it "handles requests without referer" do expect(RefererParser.path(nil)).to be_nil end diff --git a/spec/lib/open_food_network/scope_variant_to_hub_spec.rb b/spec/lib/open_food_network/scope_variant_to_hub_spec.rb index d10d3729029..cbff22dc359 100644 --- a/spec/lib/open_food_network/scope_variant_to_hub_spec.rb +++ b/spec/lib/open_food_network/scope_variant_to_hub_spec.rb @@ -4,7 +4,7 @@ require 'open_food_network/scope_variant_to_hub' module OpenFoodNetwork - describe ScopeVariantToHub do + RSpec.describe ScopeVariantToHub do let(:hub) { create(:distributor_enterprise) } let(:v) { create(:variant, price: 11.11, on_hand: 1, on_demand: true, sku: "VARIANTSKU") } let(:v2) { create(:variant, price: 22.22, on_hand: 5) } diff --git a/spec/lib/open_food_network/scope_variants_to_search_spec.rb b/spec/lib/open_food_network/scope_variants_to_search_spec.rb index e896fa8f607..c8f6104ae57 100644 --- a/spec/lib/open_food_network/scope_variants_to_search_spec.rb +++ b/spec/lib/open_food_network/scope_variants_to_search_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'open_food_network/scope_variants_for_search' -describe OpenFoodNetwork::ScopeVariantsForSearch do +RSpec.describe OpenFoodNetwork::ScopeVariantsForSearch do let!(:p1) { create(:simple_product, name: 'Product 1') } let!(:p2) { create(:simple_product, sku: 'Product 1a') } let!(:p3) { create(:simple_product, name: 'Product 3') } diff --git a/spec/lib/open_food_network/tag_rule_applicator_spec.rb b/spec/lib/open_food_network/tag_rule_applicator_spec.rb index 9aa14c8ccce..bc4195deea8 100644 --- a/spec/lib/open_food_network/tag_rule_applicator_spec.rb +++ b/spec/lib/open_food_network/tag_rule_applicator_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' module OpenFoodNetwork - describe TagRuleApplicator do + RSpec.describe TagRuleApplicator do let!(:enterprise) { create(:distributor_enterprise) } let!(:oc_tag_rule) { create(:filter_order_cycles_tag_rule, enterprise:, priority: 6, diff --git a/spec/lib/reports/bulk_coop_report_spec.rb b/spec/lib/reports/bulk_coop_report_spec.rb index d94e1429c15..775350d18d2 100644 --- a/spec/lib/reports/bulk_coop_report_spec.rb +++ b/spec/lib/reports/bulk_coop_report_spec.rb @@ -6,7 +6,7 @@ module Reporting module Reports module BulkCoop - describe Base do + RSpec.describe Base do subject { Base.new user, params } let(:user) { create(:admin_user) } diff --git a/spec/lib/reports/customers_report_spec.rb b/spec/lib/reports/customers_report_spec.rb index 7e0a4fac0d7..bdd18d57b66 100644 --- a/spec/lib/reports/customers_report_spec.rb +++ b/spec/lib/reports/customers_report_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module Customers - describe Base do + RSpec.describe Base do context "as a site admin" do let(:user) do user = create(:user) diff --git a/spec/lib/reports/enterprise_fee_summary/authorizer_spec.rb b/spec/lib/reports/enterprise_fee_summary/authorizer_spec.rb index 9409ad5f042..40b64ab74a9 100644 --- a/spec/lib/reports/enterprise_fee_summary/authorizer_spec.rb +++ b/spec/lib/reports/enterprise_fee_summary/authorizer_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module EnterpriseFeeSummary - describe Authorizer do + RSpec.describe Authorizer do let(:user) { create(:user) } let(:parameters) { Parameters.new(params) } diff --git a/spec/lib/reports/enterprise_fee_summary/enterprise_fee_summary_report_spec.rb b/spec/lib/reports/enterprise_fee_summary/enterprise_fee_summary_report_spec.rb index 2ddcf23d6cc..a11f40a7acb 100644 --- a/spec/lib/reports/enterprise_fee_summary/enterprise_fee_summary_report_spec.rb +++ b/spec/lib/reports/enterprise_fee_summary/enterprise_fee_summary_report_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Reporting::Reports::EnterpriseFeeSummary::FeeSummary do +RSpec.describe Reporting::Reports::EnterpriseFeeSummary::FeeSummary do let(:report_module) { Reporting::Reports::EnterpriseFeeSummary } # Basic data. diff --git a/spec/lib/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer_spec.rb b/spec/lib/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer_spec.rb index 76bfe69459a..a993beceded 100644 --- a/spec/lib/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer_spec.rb +++ b/spec/lib/reports/enterprise_fee_summary/enterprise_fees_with_tax_report_by_producer_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Reporting::Reports::EnterpriseFeeSummary::EnterpriseFeesWithTaxReportByProducer do +RSpec.describe Reporting::Reports::EnterpriseFeeSummary::EnterpriseFeesWithTaxReportByProducer do let(:current_user) { create(:admin_user) } let(:enterprise) { diff --git a/spec/lib/reports/enterprise_fee_summary/parameters_spec.rb b/spec/lib/reports/enterprise_fee_summary/parameters_spec.rb index 25b684d5a09..b803041573c 100644 --- a/spec/lib/reports/enterprise_fee_summary/parameters_spec.rb +++ b/spec/lib/reports/enterprise_fee_summary/parameters_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module EnterpriseFeeSummary - describe Parameters do + RSpec.describe Parameters do describe "validation" do let(:parameters) { described_class.new } diff --git a/spec/lib/reports/enterprise_fee_summary/permissions_spec.rb b/spec/lib/reports/enterprise_fee_summary/permissions_spec.rb index 8de188cbdf9..decb37a18ea 100644 --- a/spec/lib/reports/enterprise_fee_summary/permissions_spec.rb +++ b/spec/lib/reports/enterprise_fee_summary/permissions_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Reporting::Reports::EnterpriseFeeSummary::Permissions do +RSpec.describe Reporting::Reports::EnterpriseFeeSummary::Permissions do let!(:order_cycle) { create(:simple_order_cycle) } let!(:incoming_exchange) { create(:exchange, incoming: true, order_cycle:) } let!(:outgoing_exchange) { create(:exchange, incoming: false, order_cycle:) } diff --git a/spec/lib/reports/enterprise_fee_summary/report_data/enterprise_fee_type_total_spec.rb b/spec/lib/reports/enterprise_fee_summary/report_data/enterprise_fee_type_total_spec.rb index 5f26970c00e..d7e9e9f6b5f 100644 --- a/spec/lib/reports/enterprise_fee_summary/report_data/enterprise_fee_type_total_spec.rb +++ b/spec/lib/reports/enterprise_fee_summary/report_data/enterprise_fee_type_total_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Reporting::Reports::EnterpriseFeeSummary::ReportData::EnterpriseFeeTypeTotal do +RSpec.describe Reporting::Reports::EnterpriseFeeSummary::ReportData::EnterpriseFeeTypeTotal do it "sorts instances according to their attributes" do instance_a = described_class.new( fee_type: "sales", diff --git a/spec/lib/reports/enterprise_fee_summary/summarizer_spec.rb b/spec/lib/reports/enterprise_fee_summary/summarizer_spec.rb index 9070089609d..e161d845976 100644 --- a/spec/lib/reports/enterprise_fee_summary/summarizer_spec.rb +++ b/spec/lib/reports/enterprise_fee_summary/summarizer_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Reporting::Reports::EnterpriseFeeSummary::Summarizer do +RSpec.describe Reporting::Reports::EnterpriseFeeSummary::Summarizer do let(:row) { { "total_amount" => 1, "payment_method_name" => nil, diff --git a/spec/lib/reports/lettuce_share_report_spec.rb b/spec/lib/reports/lettuce_share_report_spec.rb index 528b0854274..1501ffc7780 100644 --- a/spec/lib/reports/lettuce_share_report_spec.rb +++ b/spec/lib/reports/lettuce_share_report_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module ProductsAndInventory - describe LettuceShare do + RSpec.describe LettuceShare do let(:user) { create(:user) } let(:report) { LettuceShare.new(user) } let(:variant) { create(:variant) } diff --git a/spec/lib/reports/line_items_spec.rb b/spec/lib/reports/line_items_spec.rb index 8e04eb714fe..6619634ac25 100644 --- a/spec/lib/reports/line_items_spec.rb +++ b/spec/lib/reports/line_items_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Reporting::LineItems do +RSpec.describe Reporting::LineItems do # This object lets us add some test coverage despite the very deep coupling between the class # under test and the various objects it depends on. Other more common moking strategies where very # hard. diff --git a/spec/lib/reports/order_cycle_management_report_spec.rb b/spec/lib/reports/order_cycle_management_report_spec.rb index 80bed21b3c1..65c3a2d86b2 100644 --- a/spec/lib/reports/order_cycle_management_report_spec.rb +++ b/spec/lib/reports/order_cycle_management_report_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module OrderCycleManagement - describe Base do + RSpec.describe Base do context "as a site admin" do subject { Base.new(user, params) } let(:params) { {} } diff --git a/spec/lib/reports/orders_and_distributors_report_spec.rb b/spec/lib/reports/orders_and_distributors_report_spec.rb index 689ea4d791b..37fd4de00e6 100644 --- a/spec/lib/reports/orders_and_distributors_report_spec.rb +++ b/spec/lib/reports/orders_and_distributors_report_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module OrdersAndDistributors - describe Base do + RSpec.describe Base do describe 'orders and distributors report' do it 'should return a header row describing the report' do subject = Base.new nil diff --git a/spec/lib/reports/orders_and_fulfillment/order_cycle_customer_totals_report_spec.rb b/spec/lib/reports/orders_and_fulfillment/order_cycle_customer_totals_report_spec.rb index c2d6eccbb31..16511bca45e 100644 --- a/spec/lib/reports/orders_and_fulfillment/order_cycle_customer_totals_report_spec.rb +++ b/spec/lib/reports/orders_and_fulfillment/order_cycle_customer_totals_report_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Reporting::Reports::OrdersAndFulfillment::OrderCycleCustomerTotals do +RSpec.describe Reporting::Reports::OrdersAndFulfillment::OrderCycleCustomerTotals do let!(:distributor) { create(:distributor_enterprise, name: "Apple Market") } let!(:customer) { create(:customer, enterprise: distributor, user:, code: "JHN") } let(:user) { create(:user, email: "john@example.net") } diff --git a/spec/lib/reports/orders_and_fulfillment/order_cycle_distributor_totals_by_supplier_report_spec.rb b/spec/lib/reports/orders_and_fulfillment/order_cycle_distributor_totals_by_supplier_report_spec.rb index f88dab48bd7..9bedefa1863 100644 --- a/spec/lib/reports/orders_and_fulfillment/order_cycle_distributor_totals_by_supplier_report_spec.rb +++ b/spec/lib/reports/orders_and_fulfillment/order_cycle_distributor_totals_by_supplier_report_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module OrdersAndFulfillment - describe OrderCycleDistributorTotalsBySupplier do + RSpec.describe OrderCycleDistributorTotalsBySupplier do let!(:distributor) { create(:distributor_enterprise) } let!(:order) do diff --git a/spec/lib/reports/orders_and_fulfillment/order_cycle_supplier_totals_by_distributor_report_spec.rb b/spec/lib/reports/orders_and_fulfillment/order_cycle_supplier_totals_by_distributor_report_spec.rb index a5ddd3f8774..c6cbb733d0f 100644 --- a/spec/lib/reports/orders_and_fulfillment/order_cycle_supplier_totals_by_distributor_report_spec.rb +++ b/spec/lib/reports/orders_and_fulfillment/order_cycle_supplier_totals_by_distributor_report_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module OrdersAndFulfillment - describe OrderCycleSupplierTotalsByDistributor do + RSpec.describe OrderCycleSupplierTotalsByDistributor do let!(:distributor) { create(:distributor_enterprise) } let!(:order) do diff --git a/spec/lib/reports/orders_and_fulfillment/orders_cycle_supplier_totals_report_spec.rb b/spec/lib/reports/orders_and_fulfillment/orders_cycle_supplier_totals_report_spec.rb index e5206e429a7..c40dcc90db6 100644 --- a/spec/lib/reports/orders_and_fulfillment/orders_cycle_supplier_totals_report_spec.rb +++ b/spec/lib/reports/orders_and_fulfillment/orders_cycle_supplier_totals_report_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Reporting::Reports::OrdersAndFulfillment::OrderCycleSupplierTotals do +RSpec.describe Reporting::Reports::OrdersAndFulfillment::OrderCycleSupplierTotals do let!(:distributor) { create(:distributor_enterprise) } let!(:order) do diff --git a/spec/lib/reports/packing/packing_report_spec.rb b/spec/lib/reports/packing/packing_report_spec.rb index ead8344bcc7..624a5dab5a0 100644 --- a/spec/lib/reports/packing/packing_report_spec.rb +++ b/spec/lib/reports/packing/packing_report_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe "Packing Reports" do +RSpec.describe "Packing Reports" do include AuthenticationHelper describe "fetching orders" do diff --git a/spec/lib/reports/products_and_inventory_report_spec.rb b/spec/lib/reports/products_and_inventory_report_spec.rb index 8096fa46b1f..79b8c6d21c0 100644 --- a/spec/lib/reports/products_and_inventory_report_spec.rb +++ b/spec/lib/reports/products_and_inventory_report_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module ProductsAndInventory - describe Base do + RSpec.describe Base do context "As a site admin" do let(:user) do user = create(:user) @@ -264,7 +264,7 @@ module ProductsAndInventory end end - describe AllProducts do + RSpec.describe AllProducts do let(:user) do user = create(:user) user.spree_roles << Spree::Role.find_or_create_by!(name: 'admin') diff --git a/spec/lib/reports/report_loader_spec.rb b/spec/lib/reports/report_loader_spec.rb index 930c5af1ace..af2b8778336 100644 --- a/spec/lib/reports/report_loader_spec.rb +++ b/spec/lib/reports/report_loader_spec.rb @@ -16,7 +16,7 @@ class OrangeReport; end end end -describe Reporting::ReportLoader do +RSpec.describe Reporting::ReportLoader do let(:service) { Reporting::ReportLoader.new(*arguments) } let(:report_base_class) { Reporting::Reports::Bananas::Base } let(:report_subtypes) { ["green", "yellow"] } diff --git a/spec/lib/reports/report_renderer_spec.rb b/spec/lib/reports/report_renderer_spec.rb index eda37744cad..1671f64c203 100644 --- a/spec/lib/reports/report_renderer_spec.rb +++ b/spec/lib/reports/report_renderer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Reporting::ReportRenderer do +RSpec.describe Reporting::ReportRenderer do let(:data) { [ { "id" => 1, "name" => "carrots", "quantity" => 3 }, diff --git a/spec/lib/reports/report_spec.rb b/spec/lib/reports/report_spec.rb index 4d79cc72b61..22a725f99cc 100644 --- a/spec/lib/reports/report_spec.rb +++ b/spec/lib/reports/report_spec.rb @@ -4,7 +4,7 @@ # rubocop:disable Metrics/ModuleLength module Reporting - describe ReportTemplate do + RSpec.describe ReportTemplate do let(:user) { create(:user) } let(:params) { {} } subject { described_class.new(user, params) } diff --git a/spec/lib/reports/sales_tax_report_spec.rb b/spec/lib/reports/sales_tax_report_spec.rb index aa8b6b78857..501ad972e95 100644 --- a/spec/lib/reports/sales_tax_report_spec.rb +++ b/spec/lib/reports/sales_tax_report_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module SalesTax - describe TaxTypes do + RSpec.describe TaxTypes do let(:user) { create(:user) } let(:report) { TaxTypes.new(user, {}) } diff --git a/spec/lib/reports/sales_tax_totals_by_order_spec.rb b/spec/lib/reports/sales_tax_totals_by_order_spec.rb index 088d889bb06..641bc8030e0 100644 --- a/spec/lib/reports/sales_tax_totals_by_order_spec.rb +++ b/spec/lib/reports/sales_tax_totals_by_order_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe "Reporting::Reports::SalesTax::SalesTaxTotalsByOrder" do +RSpec.describe "Reporting::Reports::SalesTax::SalesTaxTotalsByOrder" do subject(:report) { Reporting::Reports::SalesTax::SalesTaxTotalsByOrder.new(user, {}) } let(:user) { create(:user) } diff --git a/spec/lib/reports/users_and_enterprises_report_spec.rb b/spec/lib/reports/users_and_enterprises_report_spec.rb index ce0ab369d93..4f1ce546704 100644 --- a/spec/lib/reports/users_and_enterprises_report_spec.rb +++ b/spec/lib/reports/users_and_enterprises_report_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module UsersAndEnterprises - describe Base do + RSpec.describe Base do describe "query_result" do let!(:owners_and_enterprises) { double(:owners_and_enterprises) } let!(:managers_and_enterprises) { double(:managers_and_enterprises) } diff --git a/spec/lib/reports/xero_invoices_report_spec.rb b/spec/lib/reports/xero_invoices_report_spec.rb index ab4a0e3b9be..7f64e4b5c12 100644 --- a/spec/lib/reports/xero_invoices_report_spec.rb +++ b/spec/lib/reports/xero_invoices_report_spec.rb @@ -5,7 +5,7 @@ module Reporting module Reports module XeroInvoices - describe Base do + RSpec.describe Base do subject { Base.new user, {} } let(:user) { create(:user) } diff --git a/spec/lib/spree/core/environment_spec.rb b/spec/lib/spree/core/environment_spec.rb index 7eec8dc3294..114a2f05cab 100644 --- a/spec/lib/spree/core/environment_spec.rb +++ b/spec/lib/spree/core/environment_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Core::Environment do +RSpec.describe Spree::Core::Environment do # Our version doesn't add any features we could test. # So we just check that our file is loaded correctly. let(:our_file) { Rails.root.join("lib/spree/core/environment.rb").to_s } diff --git a/spec/lib/spree/core/mail_settings_spec.rb b/spec/lib/spree/core/mail_settings_spec.rb index 3953c3266f4..29b4ef3e639 100644 --- a/spec/lib/spree/core/mail_settings_spec.rb +++ b/spec/lib/spree/core/mail_settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Core::MailSettings do +RSpec.describe Spree::Core::MailSettings do context "overrides appplication defaults" do context "authentication method is login" do before do diff --git a/spec/lib/spree/core/product_duplicator_spec.rb b/spec/lib/spree/core/product_duplicator_spec.rb index 265f2e1d531..e23904ec47f 100644 --- a/spec/lib/spree/core/product_duplicator_spec.rb +++ b/spec/lib/spree/core/product_duplicator_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Core::ProductDuplicator do +RSpec.describe Spree::Core::ProductDuplicator do let(:product) do double 'Product', name: "foo", diff --git a/spec/lib/spree/core/token_resource_spec.rb b/spec/lib/spree/core/token_resource_spec.rb index 087c5b93503..1de0d25ea27 100644 --- a/spec/lib/spree/core/token_resource_spec.rb +++ b/spec/lib/spree/core/token_resource_spec.rb @@ -5,7 +5,7 @@ # Its pretty difficult to test this module in isolation b/c it needs to work in conjunction # with an actual class that extends ActiveRecord::Base and has a corresponding table in the DB. # So we'll just test it using Order instead since it included the module. -describe Spree::Core::TokenResource do +RSpec.describe Spree::Core::TokenResource do let(:order) { Spree::Order.new } let(:permission) { double(Spree::TokenizedPermission) } diff --git a/spec/lib/spree/i18n_spec.rb b/spec/lib/spree/i18n_spec.rb index 04be4e1dc4c..bb03786fa4b 100644 --- a/spec/lib/spree/i18n_spec.rb +++ b/spec/lib/spree/i18n_spec.rb @@ -3,7 +3,7 @@ require 'rspec/expectations' require 'spree/i18n' -describe "i18n" do +RSpec.describe "i18n" do before do I18n.backend.store_translations( :en, diff --git a/spec/lib/spree/localized_number_spec.rb b/spec/lib/spree/localized_number_spec.rb index 81d632c9723..31ce979d91f 100644 --- a/spec/lib/spree/localized_number_spec.rb +++ b/spec/lib/spree/localized_number_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'spree/localized_number' -describe Spree::LocalizedNumber do +RSpec.describe Spree::LocalizedNumber do describe ".parse" do context "with point separator" do it "captures the proper amount for a formatted string" do diff --git a/spec/lib/spree/money_spec.rb b/spec/lib/spree/money_spec.rb index b6f2fca8973..e79443e9209 100644 --- a/spec/lib/spree/money_spec.rb +++ b/spec/lib/spree/money_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Money do +RSpec.describe Spree::Money do include PreferencesHelper before do diff --git a/spec/lib/stripe/account_connector_spec.rb b/spec/lib/stripe/account_connector_spec.rb index b38bf88207d..c399a620fe3 100644 --- a/spec/lib/stripe/account_connector_spec.rb +++ b/spec/lib/stripe/account_connector_spec.rb @@ -5,7 +5,7 @@ require 'stripe/oauth' module Stripe - describe AccountConnector do + RSpec.describe AccountConnector do describe "create_account" do let(:user) { create(:user) } let(:enterprise) { create(:enterprise) } diff --git a/spec/lib/stripe/authorize_response_patcher_spec.rb b/spec/lib/stripe/authorize_response_patcher_spec.rb index 9ecb800ee2a..c99b2da340e 100644 --- a/spec/lib/stripe/authorize_response_patcher_spec.rb +++ b/spec/lib/stripe/authorize_response_patcher_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Stripe - describe AuthorizeResponsePatcher do + RSpec.describe AuthorizeResponsePatcher do describe "#call!" do let(:patcher) { Stripe::AuthorizeResponsePatcher.new(response) } let(:params) { {} } diff --git a/spec/lib/stripe/credit_card_cloner_spec.rb b/spec/lib/stripe/credit_card_cloner_spec.rb index f9ef2b59fd3..44acfb53739 100644 --- a/spec/lib/stripe/credit_card_cloner_spec.rb +++ b/spec/lib/stripe/credit_card_cloner_spec.rb @@ -4,7 +4,7 @@ require 'stripe/credit_card_cloner' module Stripe - describe CreditCardCloner do + RSpec.describe CreditCardCloner do let!(:user) { create(:user, email: "apple.customer@example.com") } let!(:enterprise) { create(:enterprise) } diff --git a/spec/lib/stripe/credit_card_remover_spec.rb b/spec/lib/stripe/credit_card_remover_spec.rb index 39638ee82d3..a5af7ba88a0 100644 --- a/spec/lib/stripe/credit_card_remover_spec.rb +++ b/spec/lib/stripe/credit_card_remover_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'stripe/credit_card_remover' -describe Stripe::CreditCardRemover do +RSpec.describe Stripe::CreditCardRemover do let(:credit_card) { create(:credit_card, gateway_payment_profile_id: pm_card.id, user:) } let!(:user) { create(:user, email: "apple.customer@example.com") } diff --git a/spec/lib/stripe/payment_intent_validator_spec.rb b/spec/lib/stripe/payment_intent_validator_spec.rb index d4d37afa2bf..c3d917b6147 100644 --- a/spec/lib/stripe/payment_intent_validator_spec.rb +++ b/spec/lib/stripe/payment_intent_validator_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'stripe/payment_intent_validator' -describe Stripe::PaymentIntentValidator do +RSpec.describe Stripe::PaymentIntentValidator do let(:payment_method) { create(:stripe_sca_payment_method, distributor_ids: [create(:distributor_enterprise).id], preferred_enterprise_id: create(:enterprise).id) @@ -18,131 +18,290 @@ } let(:validator) { Stripe::PaymentIntentValidator.new(payment) } - context "when payment intent is valid" do - shared_examples "payments intents" do |card_type, card_number| - context "from #{card_type}" do - let!(:pm_card) do - Stripe::PaymentMethod.create({ - type: 'card', - card: { - number: card_number, - exp_month: 12, - exp_year: year_valid, - cvc: '314', - }, - }) - end - let!(:payment_intent) do - Stripe::PaymentIntent.create({ - amount: 100, - currency: 'eur', - payment_method: pm_card, - payment_method_types: ['card'], - capture_method: 'manual', - }) - end - let(:payment_intent_response_body) { - [id: payment_intent.id, status: payment_intent.status] - } + describe "as a guest" do + context "when payment intent is valid" do + shared_examples "payments intents" do |card_type, card_number| + context "from #{card_type}" do + let!(:pm_card) do + Stripe::PaymentMethod.create({ + type: 'card', + card: { + number: card_number, + exp_month: 12, + exp_year: year_valid, + cvc: '314', + }, + }) + end + let!(:payment_intent) do + Stripe::PaymentIntent.create({ + amount: 100, + currency: 'eur', + payment_method: pm_card, + payment_method_types: ['card'], + capture_method: 'manual', + }) + end + let(:payment_intent_response_body) { + [id: payment_intent.id, status: payment_intent.status] + } - before do - Stripe::PaymentIntent.confirm(payment_intent.id) - end - it "returns payment intent id and does not raise" do - expect { - result = validator.call - expect(result).to eq payment_intent_response_body - }.not_to raise_error Stripe::StripeError - end + before do + Stripe::PaymentIntent.confirm(payment_intent.id) + end + it "returns payment intent id and does not raise" do + expect { + result = validator.call + expect(result).to eq payment_intent_response_body + }.not_to raise_error Stripe::StripeError + end - it "captures the payment" do - expect(Stripe::PaymentIntent.retrieve( - payment_intent.id - ).status).to eq("requires_capture") + it "captures the payment" do + expect(Stripe::PaymentIntent.retrieve( + payment_intent.id + ).status).to eq("requires_capture") - Stripe::PaymentIntent.capture(payment_intent.id) + Stripe::PaymentIntent.capture(payment_intent.id) - expect(Stripe::PaymentIntent.retrieve( - payment_intent.id - ).status).to eq("succeeded") + expect(Stripe::PaymentIntent.retrieve( + payment_intent.id + ).status).to eq("succeeded") + end end end - end - context "valid non-3D credit cards are correctly handled" do - it_behaves_like "payments intents", "Visa", 4_242_424_242_424_242 - it_behaves_like "payments intents", "Visa (debit)", 4_000_056_655_665_556 - it_behaves_like "payments intents", "Mastercard", 5_555_555_555_554_444 - it_behaves_like "payments intents", "Mastercard (2-series)", 2_223_003_122_003_222 - it_behaves_like "payments intents", "Mastercard (debit)", 5_200_828_282_828_210 - it_behaves_like "payments intents", "Mastercard (prepaid)", 5_105_105_105_105_100 - it_behaves_like "payments intents", "American Express", 378_282_246_310_005 - it_behaves_like "payments intents", "American Express", 371_449_635_398_431 - it_behaves_like "payments intents", "Discover", 6_011_111_111_111_117 - it_behaves_like "payments intents", "Discover", 6_011_000_990_139_424 - it_behaves_like "payments intents", "Discover (debit)", 6_011_981_111_111_113 - it_behaves_like "payments intents", "Diners Club", 3_056_930_009_020_004 - it_behaves_like "payments intents", "Diners Club (14-digit card)", 36_227_206_271_667 - it_behaves_like "payments intents", "BCcard and DinaCard", 6_555_900_000_604_105 - it_behaves_like "payments intents", "JCB", 3_566_002_020_360_505 - it_behaves_like "payments intents", "UnionPay", 6_200_000_000_000_005 - it_behaves_like "payments intents", "UnionPay (19-digit card)", 6_205_500_000_000_000_004 - end + context "valid non-3D credit cards are correctly handled" do + it_behaves_like "payments intents", "Visa", 4_242_424_242_424_242 + it_behaves_like "payments intents", "Visa (debit)", 4_000_056_655_665_556 + it_behaves_like "payments intents", "Mastercard", 5_555_555_555_554_444 + it_behaves_like "payments intents", "Mastercard (2-series)", 2_223_003_122_003_222 + it_behaves_like "payments intents", "Mastercard (debit)", 5_200_828_282_828_210 + it_behaves_like "payments intents", "Mastercard (prepaid)", 5_105_105_105_105_100 + it_behaves_like "payments intents", "American Express", 378_282_246_310_005 + it_behaves_like "payments intents", "American Express", 371_449_635_398_431 + it_behaves_like "payments intents", "Discover", 6_011_111_111_111_117 + it_behaves_like "payments intents", "Discover", 6_011_000_990_139_424 + it_behaves_like "payments intents", "Discover (debit)", 6_011_981_111_111_113 + it_behaves_like "payments intents", "Diners Club", 3_056_930_009_020_004 + it_behaves_like "payments intents", "Diners Club (14-digit card)", 36_227_206_271_667 + it_behaves_like "payments intents", "BCcard and DinaCard", 6_555_900_000_604_105 + it_behaves_like "payments intents", "JCB", 3_566_002_020_360_505 + it_behaves_like "payments intents", "UnionPay", 6_200_000_000_000_005 + it_behaves_like "payments intents", "UnionPay (19-digit card)", 6_205_500_000_000_000_004 + end - xcontext "valid 3D cards are correctly handled" do - pending("updating spec to handle 3D2S cards") - it_behaves_like "payments intents", "UnionPay (debit)", 6_200_000_000_000_047 + xcontext "valid 3D cards are correctly handled" do + pending("updating spec to handle 3D2S cards") + it_behaves_like "payments intents", "UnionPay (debit)", 6_200_000_000_000_047 + end end - end - context "when payment intent is invalid" do - shared_examples "payments intents" do |card_type, card_number, error_message| - context "from #{card_type}" do - let!(:pm_card) do - Stripe::PaymentMethod.create({ - type: 'card', - card: { - number: card_number, - exp_month: 12, - exp_year: year_valid, - cvc: '314', - }, - }) + context "when payment intent is invalid" do + shared_examples "payments intents" do |card_type, card_number, error_message| + context "from #{card_type}" do + let!(:pm_card) do + Stripe::PaymentMethod.create({ + type: 'card', + card: { + number: card_number, + exp_month: 12, + exp_year: year_valid, + cvc: '314', + }, + }) + end + let(:payment_intent) do + Stripe::PaymentIntent.create({ + amount: 100, + currency: 'eur', + payment_method: pm_card, + payment_method_types: ['card'], + capture_method: 'manual', + }) + end + it "raises Stripe error with payment intent last_payment_error as message" do + expect { + Stripe::PaymentIntent.confirm(payment_intent.id) + }.to raise_error Stripe::StripeError, error_message + end end - let(:payment_intent) do - Stripe::PaymentIntent.create({ - amount: 100, - currency: 'eur', - payment_method: pm_card, - payment_method_types: ['card'], - capture_method: 'manual', - }) - end - it "raises Stripe error with payment intent last_payment_error as message" do - expect { + end + context "invalid credit cards are correctly handled" do + it_behaves_like "payments intents", "Generic decline", 4_000_000_000_000_002, + "Your card was declined." + it_behaves_like "payments intents", "Insufficient funds decline", 4_000_000_000_009_995, + "Your card has insufficient funds." + it_behaves_like "payments intents", "Lost card decline", 4_000_000_000_009_987, + "Your card was declined." + it_behaves_like "payments intents", "Stolen card decline", 4_000_000_000_009_979, + "Your card was declined." + it_behaves_like "payments intents", "Expired card decline", 4_000_000_000_000_069, + "Your card has expired." + it_behaves_like "payments intents", "Incorrect CVC decline", 4_000_000_000_000_127, + "Your card's security code is incorrect." + it_behaves_like "payments intents", "Processing error decline", 4_000_000_000_000_119, + "An error occurred while processing your card. Try again in a little bit." + it_behaves_like "payments intents", "Exceeding velocity limit decline", + 4_000_000_000_006_975, + %(Your card was declined for making repeated attempts too frequently + or exceeding its amount limit.).squish + end + end + end + + describe "as a Stripe customer" do + context "when payment intent is valid" do + let(:payment_method_id) { pm_card.id } + let(:customer_id) { customer.id } + let!(:user) { create(:user, email: "apple.customer@example.com") } + let(:credit_card) { create(:credit_card, gateway_payment_profile_id: pm_card.id, user:) } + let(:customer) do + Stripe::Customer.create({ + name: 'Apple Customer', + email: 'applecustomer@example.com', + }) + end + + shared_examples "payments intents" do |card_type, card_number| + context "from #{card_type}" do + let!(:pm_card) do + Stripe::PaymentMethod.create({ + type: 'card', + card: { + number: card_number, + exp_month: 12, + exp_year: year_valid, + cvc: '314', + }, + }) + end + let!(:payment_intent) do + Stripe::PaymentIntent.create({ + amount: 100, + currency: 'eur', + payment_method: pm_card, + payment_method_types: ['card'], + capture_method: 'manual', + customer: customer.id, + setup_future_usage: "off_session" + }) + end + let(:payment_intent_response_body) { + [id: payment_intent.id, status: payment_intent.status] + } + + before do + credit_card.update_attribute :gateway_customer_profile_id, customer_id Stripe::PaymentIntent.confirm(payment_intent.id) - }.to raise_error Stripe::StripeError, error_message + end + it "returns payment intent id and does not raise" do + expect { + result = validator.call + expect(result).to eq payment_intent_response_body + }.not_to raise_error Stripe::StripeError + end + + it "captures the payment" do + expect(Stripe::PaymentIntent.retrieve( + payment_intent.id + ).status).to eq("requires_capture") + + Stripe::PaymentIntent.capture(payment_intent.id) + + expect(Stripe::PaymentIntent.retrieve( + payment_intent.id + ).status).to eq("succeeded") + end end end + + context "valid non-3D credit cards are correctly handled" do + it_behaves_like "payments intents", "Visa", 4_242_424_242_424_242 + it_behaves_like "payments intents", "Visa (debit)", 4_000_056_655_665_556 + it_behaves_like "payments intents", "Mastercard", 5_555_555_555_554_444 + it_behaves_like "payments intents", "Mastercard (2-series)", 2_223_003_122_003_222 + it_behaves_like "payments intents", "Mastercard (debit)", 5_200_828_282_828_210 + it_behaves_like "payments intents", "Mastercard (prepaid)", 5_105_105_105_105_100 + it_behaves_like "payments intents", "American Express", 378_282_246_310_005 + it_behaves_like "payments intents", "American Express", 371_449_635_398_431 + it_behaves_like "payments intents", "Discover", 6_011_111_111_111_117 + it_behaves_like "payments intents", "Discover", 6_011_000_990_139_424 + it_behaves_like "payments intents", "Discover (debit)", 6_011_981_111_111_113 + it_behaves_like "payments intents", "Diners Club", 3_056_930_009_020_004 + it_behaves_like "payments intents", "Diners Club (14-digit card)", 36_227_206_271_667 + it_behaves_like "payments intents", "BCcard and DinaCard", 6_555_900_000_604_105 + it_behaves_like "payments intents", "JCB", 3_566_002_020_360_505 + it_behaves_like "payments intents", "UnionPay", 6_200_000_000_000_005 + it_behaves_like "payments intents", "UnionPay (19-digit card)", 6_205_500_000_000_000_004 + end + + xcontext "valid 3D cards are correctly handled" do + pending("updating spec to handle 3D2S cards") + it_behaves_like "payments intents", "UnionPay (debit)", 6_200_000_000_000_047 + end end - context "invalid credit cards are correctly handled" do - it_behaves_like "payments intents", "Generic decline", 4_000_000_000_000_002, - "Your card was declined." - it_behaves_like "payments intents", "Insufficient funds decline", 4_000_000_000_009_995, - "Your card has insufficient funds." - it_behaves_like "payments intents", "Lost card decline", 4_000_000_000_009_987, - "Your card was declined." - it_behaves_like "payments intents", "Stolen card decline", 4_000_000_000_009_979, - "Your card was declined." - it_behaves_like "payments intents", "Expired card decline", 4_000_000_000_000_069, - "Your card has expired." - it_behaves_like "payments intents", "Incorrect CVC decline", 4_000_000_000_000_127, - "Your card's security code is incorrect." - it_behaves_like "payments intents", "Processing error decline", 4_000_000_000_000_119, - "An error occurred while processing your card. Try again in a little bit." - it_behaves_like "payments intents", "Exceeding velocity limit decline", - 4_000_000_000_006_975, - %(Your card was declined for making repeated attempts too frequently - or exceeding its amount limit.).squish + context "when payment intent is invalid" do + let(:payment_method_id) { pm_card.id } + let(:customer_id) { customer.id } + let!(:user) { create(:user, email: "apple.customer@example.com") } + let(:credit_card) { create(:credit_card, gateway_payment_profile_id: pm_card.id, user:) } + let(:customer) do + Stripe::Customer.create({ + name: 'Apple Customer', + email: 'applecustomer@example.com', + }) + end + + shared_examples "payments intents" do |card_type, card_number, error_message| + context "from #{card_type}" do + let!(:pm_card) do + Stripe::PaymentMethod.create({ + type: 'card', + card: { + number: card_number, + exp_month: 12, + exp_year: year_valid, + cvc: '314', + }, + }) + end + let(:payment_intent) do + Stripe::PaymentIntent.create({ + amount: 100, + currency: 'eur', + payment_method: pm_card, + payment_method_types: ['card'], + capture_method: 'manual', + customer: customer.id, + setup_future_usage: "off_session" + }) + end + it "raises Stripe error with payment intent last_payment_error as message" do + expect { + Stripe::PaymentIntent.confirm(payment_intent.id) + }.to raise_error Stripe::StripeError, error_message + end + end + end + context "invalid credit cards are correctly handled" do + it_behaves_like "payments intents", "Generic decline", 4_000_000_000_000_002, + "Your card was declined." + it_behaves_like "payments intents", "Insufficient funds decline", 4_000_000_000_009_995, + "Your card has insufficient funds." + it_behaves_like "payments intents", "Lost card decline", 4_000_000_000_009_987, + "Your card was declined." + it_behaves_like "payments intents", "Stolen card decline", 4_000_000_000_009_979, + "Your card was declined." + it_behaves_like "payments intents", "Expired card decline", 4_000_000_000_000_069, + "Your card has expired." + it_behaves_like "payments intents", "Incorrect CVC decline", 4_000_000_000_000_127, + "Your card's security code is incorrect." + it_behaves_like "payments intents", "Processing error decline", 4_000_000_000_000_119, + "An error occurred while processing your card. Try again in a little bit." + it_behaves_like "payments intents", "Exceeding velocity limit decline", + 4_000_000_000_006_975, + %(Your card was declined for making repeated attempts too frequently + or exceeding its amount limit.).squish + end end end end diff --git a/spec/lib/stripe/profile_storer_spec.rb b/spec/lib/stripe/profile_storer_spec.rb index 663db16165e..972651ff2fe 100644 --- a/spec/lib/stripe/profile_storer_spec.rb +++ b/spec/lib/stripe/profile_storer_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Stripe - describe ProfileStorer do + RSpec.describe ProfileStorer do include StripeStubs describe "create_customer_from_token", :vcr, :stripe_version do diff --git a/spec/lib/stripe/webhook_handler_spec.rb b/spec/lib/stripe/webhook_handler_spec.rb index df835ecf979..6750123fb41 100644 --- a/spec/lib/stripe/webhook_handler_spec.rb +++ b/spec/lib/stripe/webhook_handler_spec.rb @@ -4,7 +4,7 @@ require 'stripe/webhook_handler' module Stripe - describe WebhookHandler do + RSpec.describe WebhookHandler do let(:event) { double(:event, type: 'some.event') } let(:handler) { WebhookHandler.new(event) } diff --git a/spec/lib/tasks/data/remove_transient_data_spec.rb b/spec/lib/tasks/data/remove_transient_data_spec.rb index af47e064756..ff2667d7496 100644 --- a/spec/lib/tasks/data/remove_transient_data_spec.rb +++ b/spec/lib/tasks/data/remove_transient_data_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'tasks/data/remove_transient_data' -describe RemoveTransientData do +RSpec.describe RemoveTransientData do describe '#call' do let(:retention_period) { RemoveTransientData::RETENTION_PERIOD } diff --git a/spec/lib/tasks/data/truncate_data_rake_spec.rb b/spec/lib/tasks/data/truncate_data_rake_spec.rb index d2f86fc8266..a04221200ab 100644 --- a/spec/lib/tasks/data/truncate_data_rake_spec.rb +++ b/spec/lib/tasks/data/truncate_data_rake_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'rake' -describe 'truncate_data.rake' do +RSpec.describe 'truncate_data.rake' do describe ':truncate' do context 'when months_to_keep is specified' do it 'truncates order cycles closed earlier than months_to_keep months ago' do diff --git a/spec/lib/tasks/data/truncate_data_spec.rb b/spec/lib/tasks/data/truncate_data_spec.rb index fe2b249d8e4..e799ec3a027 100644 --- a/spec/lib/tasks/data/truncate_data_spec.rb +++ b/spec/lib/tasks/data/truncate_data_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'tasks/data/truncate_data' -describe TruncateData do +RSpec.describe TruncateData do describe '#call' do before do allow(Spree::ReturnAuthorization).to receive(:delete_all) diff --git a/spec/lib/tasks/enterprises_rake_spec.rb b/spec/lib/tasks/enterprises_rake_spec.rb index dfcb91cebda..0ebf97b7d72 100644 --- a/spec/lib/tasks/enterprises_rake_spec.rb +++ b/spec/lib/tasks/enterprises_rake_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'rake' -describe 'enterprises.rake' do +RSpec.describe 'enterprises.rake' do before(:all) do Rake.application.rake_require("tasks/enterprises") Rake::Task.define_task(:environment) diff --git a/spec/lib/tasks/reset_spec.rb b/spec/lib/tasks/reset_spec.rb index 9c05cff671c..99b0237bb55 100644 --- a/spec/lib/tasks/reset_spec.rb +++ b/spec/lib/tasks/reset_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'rake' -describe "reset.rake" do +RSpec.describe "reset.rake" do before(:all) do Rake.application.rake_require("tasks/reset") Rake::Task.define_task(:environment) diff --git a/spec/lib/tasks/sample_data_rake_spec.rb b/spec/lib/tasks/sample_data_rake_spec.rb index a22ebce9daf..4fa798e53a4 100644 --- a/spec/lib/tasks/sample_data_rake_spec.rb +++ b/spec/lib/tasks/sample_data_rake_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'rake' -describe 'sample_data.rake' do +RSpec.describe 'sample_data.rake' do before(:all) do Rake.application.rake_require 'tasks/sample_data' Rake::Task.define_task(:environment) diff --git a/spec/lib/tasks/users_rake_spec.rb b/spec/lib/tasks/users_rake_spec.rb index 5fdc6a04870..ebf5e8a5a12 100644 --- a/spec/lib/tasks/users_rake_spec.rb +++ b/spec/lib/tasks/users_rake_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'rake' -describe 'users.rake' do +RSpec.describe 'users.rake' do before do Rake.application.rake_require 'tasks/users' Rake::Task.define_task(:environment) diff --git a/spec/mailers/enterprise_mailer_spec.rb b/spec/mailers/enterprise_mailer_spec.rb index a9417a3841e..e7de3e3a891 100644 --- a/spec/mailers/enterprise_mailer_spec.rb +++ b/spec/mailers/enterprise_mailer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe EnterpriseMailer do +RSpec.describe EnterpriseMailer do let!(:enterprise) { create(:enterprise) } let!(:user) { create(:user) } diff --git a/spec/lib/spree/core/mail_interceptor_spec.rb b/spec/mailers/mail_interceptor_spec.rb similarity index 97% rename from spec/lib/spree/core/mail_interceptor_spec.rb rename to spec/mailers/mail_interceptor_spec.rb index cf4569a5304..510cc3deeae 100644 --- a/spec/lib/spree/core/mail_interceptor_spec.rb +++ b/spec/mailers/mail_interceptor_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' # Here we use the OrderMailer as a way to test the mail interceptor. -describe Spree::OrderMailer do +RSpec.describe Spree::OrderMailer do let(:order) do Spree::Order.new(distributor: create(:enterprise), bill_address: create(:address)) diff --git a/spec/mailers/order_mailer_spec.rb b/spec/mailers/order_mailer_spec.rb index 506a05d6b4d..34206213d55 100644 --- a/spec/mailers/order_mailer_spec.rb +++ b/spec/mailers/order_mailer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::OrderMailer do +RSpec.describe Spree::OrderMailer do describe '#confirm_email_for_customer' do subject(:email) { described_class.confirm_email_for_customer(order) } diff --git a/spec/mailers/producer_mailer_spec.rb b/spec/mailers/producer_mailer_spec.rb index b6460e4f6af..b4e1be284af 100644 --- a/spec/mailers/producer_mailer_spec.rb +++ b/spec/mailers/producer_mailer_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'yaml' -describe ProducerMailer, type: :mailer do +RSpec.describe ProducerMailer, type: :mailer do let!(:zone) { create(:zone_with_member) } let!(:tax_rate) { create(:tax_rate, included_in_price: true, calculator: Calculator::DefaultTax.new, zone:, diff --git a/spec/mailers/report_mailer_spec.rb b/spec/mailers/report_mailer_spec.rb index 54a63845ea8..b23932d3a31 100644 --- a/spec/mailers/report_mailer_spec.rb +++ b/spec/mailers/report_mailer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ReportMailer do +RSpec.describe ReportMailer do describe "#report_ready" do subject(:email) { ReportMailer.with( diff --git a/spec/mailers/shipment_mailer_spec.rb b/spec/mailers/shipment_mailer_spec.rb index f0ea130c64c..e81ea4d0cb7 100644 --- a/spec/mailers/shipment_mailer_spec.rb +++ b/spec/mailers/shipment_mailer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::ShipmentMailer do +RSpec.describe Spree::ShipmentMailer do let(:shipment) do order = build(:order_with_distributor) product = build(:product, name: %{The "BEST" product}) diff --git a/spec/mailers/subscription_mailer_spec.rb b/spec/mailers/subscription_mailer_spec.rb index 12cad33ecea..93e4b825239 100644 --- a/spec/mailers/subscription_mailer_spec.rb +++ b/spec/mailers/subscription_mailer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe SubscriptionMailer, type: :mailer do +RSpec.describe SubscriptionMailer, type: :mailer do include ActionView::Helpers::SanitizeHelper describe '#placement_email' do diff --git a/spec/mailers/test_mailer_spec.rb b/spec/mailers/test_mailer_spec.rb index 181b93164ee..191f84a3444 100644 --- a/spec/mailers/test_mailer_spec.rb +++ b/spec/mailers/test_mailer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::TestMailer do +RSpec.describe Spree::TestMailer do let(:user) { create(:user) } context ":from not set explicitly" do diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb index 62d144d87f6..14dbb566f34 100644 --- a/spec/mailers/user_mailer_spec.rb +++ b/spec/mailers/user_mailer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::UserMailer do +RSpec.describe Spree::UserMailer do let(:user) { build(:user) } describe '#signup_confirmation' do diff --git a/spec/migrations/20240213044159_copy_oidc_data_to_oidc_accounts_spec.rb b/spec/migrations/20240213044159_copy_oidc_data_to_oidc_accounts_spec.rb index d2bbd816944..8a134c8b590 100644 --- a/spec/migrations/20240213044159_copy_oidc_data_to_oidc_accounts_spec.rb +++ b/spec/migrations/20240213044159_copy_oidc_data_to_oidc_accounts_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require_relative '../../db/migrate/20240213044159_copy_oidc_data_to_oidc_accounts' -describe CopyOidcDataToOidcAccounts do +RSpec.describe CopyOidcDataToOidcAccounts do describe "up" do let!(:user) { create(:user) } let!(:oidc_user) { diff --git a/spec/migrations/20240502035220_update_n8n_url_spec.rb b/spec/migrations/20240502035220_update_n8n_url_spec.rb new file mode 100644 index 00000000000..2c318dcf18d --- /dev/null +++ b/spec/migrations/20240502035220_update_n8n_url_spec.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_relative '../../db/migrate/20240502035220_update_n8n_url' + +RSpec.describe UpdateN8nUrl do + # We may want to move this to a support file if this syntax is useful in + # other places. Reference: + # - https://stackoverflow.com/a/34969429/3377535 + RSpec::Matchers.define_negated_matcher :not_change, :change + + let(:enterprise) { create(:enterprise) } + let(:old_data) { + { + link: "https://link-to-form", + destroy: "https://n8n.openfoodnetwork.org.uk/webhook/remove-enterprise?key=abc&id=123", + } + } + let(:new_data) { + { + link: "https://link-to-form", + destroy: "https://n8n.openfoodnetwork.org/webhook/remove-enterprise?key=abc&id=123", + } + } + + it "updates old connected app links" do + app = ConnectedApp.create!(enterprise:, data: old_data,) + + expect { + subject.up + app.reload + }.to change { + app.data["destroy"] + }.to("https://n8n.openfoodnetwork.org/webhook/remove-enterprise?key=abc&id=123") + .and not_change { + app.data["link"] + } + end + + it "keeps new connected app links" do + app = ConnectedApp.create!(enterprise:, data: new_data,) + + expect { + subject.up + app.reload + }.not_to change { + app.data + } + end +end diff --git a/spec/migrations/convert_stripe_connect_to_stripe_sca_spec.rb b/spec/migrations/convert_stripe_connect_to_stripe_sca_spec.rb index 45248ce68cf..f107bb2b661 100644 --- a/spec/migrations/convert_stripe_connect_to_stripe_sca_spec.rb +++ b/spec/migrations/convert_stripe_connect_to_stripe_sca_spec.rb @@ -12,7 +12,7 @@ class StripeConnect < Gateway::StripeSCA end end -describe ConvertStripeConnectToStripeSca do +RSpec.describe ConvertStripeConnectToStripeSca do let(:owner) { create(:distributor_enterprise) } let(:new_owner) { create(:distributor_enterprise) } let(:old_stripe_connect) { diff --git a/spec/migrations/migrate_admin_tax_amounts_spec.rb b/spec/migrations/migrate_admin_tax_amounts_spec.rb index b60c8ae762c..41250be1ccc 100644 --- a/spec/migrations/migrate_admin_tax_amounts_spec.rb +++ b/spec/migrations/migrate_admin_tax_amounts_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require_relative '../../db/migrate/20210617203927_migrate_admin_tax_amounts' -describe MigrateAdminTaxAmounts do +RSpec.describe MigrateAdminTaxAmounts do subject { MigrateAdminTaxAmounts.new } let(:tax_category10) { create(:tax_category) } diff --git a/spec/migrations/migrate_customer_names_spec.rb b/spec/migrations/migrate_customer_names_spec.rb index 2e014efefab..9338e0e9a8d 100644 --- a/spec/migrations/migrate_customer_names_spec.rb +++ b/spec/migrations/migrate_customer_names_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require_relative '../../db/migrate/20211027140313_migrate_customer_names' -describe MigrateCustomerNames do +RSpec.describe MigrateCustomerNames do subject { MigrateCustomerNames.new } let!(:enterprise1) { create(:enterprise) } diff --git a/spec/migrations/split_customer_names_spec.rb b/spec/migrations/split_customer_names_spec.rb index 76c38035536..3d94e32eddc 100644 --- a/spec/migrations/split_customer_names_spec.rb +++ b/spec/migrations/split_customer_names_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require_relative '../../db/migrate/20220105085730_migrate_customers_data' -describe MigrateCustomersData do +RSpec.describe MigrateCustomersData do let!(:customer1) { create(:customer, name: "Timmy Test", first_name: "", last_name: "", bill_address: nil) } diff --git a/spec/migrations/update_enterprise_instagram_links_spec.rb b/spec/migrations/update_enterprise_instagram_links_spec.rb index 99a2a770f08..6dc5ec5ef30 100644 --- a/spec/migrations/update_enterprise_instagram_links_spec.rb +++ b/spec/migrations/update_enterprise_instagram_links_spec.rb @@ -4,7 +4,7 @@ require Rails.root.join('db/migrate/20221208150521_update_enterprise_instagram_links.rb') -describe UpdateEnterpriseInstagramLinks do +RSpec.describe UpdateEnterpriseInstagramLinks do let!(:enterprise1) { create(:enterprise, instagram: "https://www.instagram.com/happyfarm") } let!(:enterprise2) { create(:enterprise, instagram: "@happyfarm") } diff --git a/spec/models/adjustment_metadata_spec.rb b/spec/models/adjustment_metadata_spec.rb index 66ae5bc6f0b..9f4cd157b3e 100644 --- a/spec/models/adjustment_metadata_spec.rb +++ b/spec/models/adjustment_metadata_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe AdjustmentMetadata do +RSpec.describe AdjustmentMetadata do it { is_expected.to belong_to(:adjustment).required } it { is_expected.to belong_to(:enterprise).required } diff --git a/spec/models/calculator/flat_percent_item_total_spec.rb b/spec/models/calculator/flat_percent_item_total_spec.rb index 3305c7791a8..8ffb10918aa 100644 --- a/spec/models/calculator/flat_percent_item_total_spec.rb +++ b/spec/models/calculator/flat_percent_item_total_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Calculator::FlatPercentItemTotal do +RSpec.describe Calculator::FlatPercentItemTotal do let(:calculator) { Calculator::FlatPercentItemTotal.new } let(:line_item) { build_stubbed(:line_item, price: 10, quantity: 1) } diff --git a/spec/models/calculator/flat_percent_per_item_spec.rb b/spec/models/calculator/flat_percent_per_item_spec.rb index ac873a0ba7a..c8efad27a62 100644 --- a/spec/models/calculator/flat_percent_per_item_spec.rb +++ b/spec/models/calculator/flat_percent_per_item_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Calculator::FlatPercentPerItem do +RSpec.describe Calculator::FlatPercentPerItem do let(:calculator) { Calculator::FlatPercentPerItem.new preferred_flat_percent: 20 } it { is_expected.to validate_numericality_of(:preferred_flat_percent) } diff --git a/spec/models/calculator/flat_rate_spec.rb b/spec/models/calculator/flat_rate_spec.rb index 92eaa864d00..6b8ced68a6d 100644 --- a/spec/models/calculator/flat_rate_spec.rb +++ b/spec/models/calculator/flat_rate_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Calculator::FlatRate do +RSpec.describe Calculator::FlatRate do let(:calculator) { Calculator::FlatRate.new } before { allow(calculator).to receive_messages preferred_amount: 10 } diff --git a/spec/models/calculator/flexi_rate_spec.rb b/spec/models/calculator/flexi_rate_spec.rb index 6f33270b43a..7129d1555e8 100644 --- a/spec/models/calculator/flexi_rate_spec.rb +++ b/spec/models/calculator/flexi_rate_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Calculator::FlexiRate do +RSpec.describe Calculator::FlexiRate do let(:line_item) { build_stubbed(:line_item, quantity:) } let(:calculator) do Calculator::FlexiRate.new( diff --git a/spec/models/calculator/per_item_spec.rb b/spec/models/calculator/per_item_spec.rb index 914ca33dfaf..78e324290ae 100644 --- a/spec/models/calculator/per_item_spec.rb +++ b/spec/models/calculator/per_item_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Calculator::PerItem do +RSpec.describe Calculator::PerItem do let(:calculator) { Calculator::PerItem.new(preferred_amount: 10) } let(:shipping_calculable) { double(:calculable) } let(:line_item) { build_stubbed(:line_item, quantity: 5) } diff --git a/spec/models/calculator/price_sack_spec.rb b/spec/models/calculator/price_sack_spec.rb index afab174fe5f..229f6b9cbfc 100644 --- a/spec/models/calculator/price_sack_spec.rb +++ b/spec/models/calculator/price_sack_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Calculator::PriceSack do +RSpec.describe Calculator::PriceSack do let(:calculator) do calculator = Calculator::PriceSack.new calculator.preferred_minimal_amount = 5 diff --git a/spec/models/calculator/weight_spec.rb b/spec/models/calculator/weight_spec.rb index 915562c7b15..ec7907f6382 100644 --- a/spec/models/calculator/weight_spec.rb +++ b/spec/models/calculator/weight_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Calculator::Weight do +RSpec.describe Calculator::Weight do it "computes shipping cost for an order by total weight" do variant1 = build_stubbed(:variant, unit_value: 10_000) variant2 = build_stubbed(:variant, unit_value: 20_000) diff --git a/spec/models/column_preference_spec.rb b/spec/models/column_preference_spec.rb index 9a7e76a70a2..99f64029870 100644 --- a/spec/models/column_preference_spec.rb +++ b/spec/models/column_preference_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ColumnPreference, type: :model do +RSpec.describe ColumnPreference, type: :model do subject { ColumnPreference.new( user:, action_name: :customers_index, column_name: :email diff --git a/spec/models/concerns/balance_spec.rb b/spec/models/concerns/balance_spec.rb index 9531f048168..dcf82dd6016 100644 --- a/spec/models/concerns/balance_spec.rb +++ b/spec/models/concerns/balance_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Balance do +RSpec.describe Balance do context "#new_outstanding_balance" do context 'when orders are in cart state' do let(:order) { build(:order, total: 100, payment_total: 10, state: 'cart') } diff --git a/spec/models/concerns/calculated_adjustments_spec.rb b/spec/models/concerns/calculated_adjustments_spec.rb index 3020088b0f7..73238a055c1 100644 --- a/spec/models/concerns/calculated_adjustments_spec.rb +++ b/spec/models/concerns/calculated_adjustments_spec.rb @@ -5,7 +5,7 @@ # Its pretty difficult to test this module in isolation b/c it needs to work in conjunction # with an actual class that extends ActiveRecord::Base and has a corresponding table in the DB. # So we'll just test it using Order and ShippingMethod. These classes are including the module. -describe CalculatedAdjustments do +RSpec.describe CalculatedAdjustments do let(:calculator) { build(:calculator) } let(:tax_rate) { Spree::TaxRate.new(calculator:) } diff --git a/spec/models/concerns/order_shipment_spec.rb b/spec/models/concerns/order_shipment_spec.rb index 26dbb3937c4..fe5843ebf3f 100644 --- a/spec/models/concerns/order_shipment_spec.rb +++ b/spec/models/concerns/order_shipment_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderShipment do +RSpec.describe OrderShipment do let(:order) { create(:order) } describe "#shipping_method" do diff --git a/spec/models/concerns/product_stock_spec.rb b/spec/models/concerns/product_stock_spec.rb index 0024035f915..751f57058af 100644 --- a/spec/models/concerns/product_stock_spec.rb +++ b/spec/models/concerns/product_stock_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe ProductStock do +RSpec.describe ProductStock do let(:product) { create(:simple_product) } context "when product has one variant" do diff --git a/spec/models/concerns/variant_stock_spec.rb b/spec/models/concerns/variant_stock_spec.rb index daff2825fc4..4a25c58355e 100644 --- a/spec/models/concerns/variant_stock_spec.rb +++ b/spec/models/concerns/variant_stock_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe VariantStock do +RSpec.describe VariantStock do let(:variant) { create(:variant) } describe '#after_save' do diff --git a/spec/models/content_configuration_spec.rb b/spec/models/content_configuration_spec.rb index 07f8bcc18d3..4b29dd4904c 100644 --- a/spec/models/content_configuration_spec.rb +++ b/spec/models/content_configuration_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ContentConfiguration do +RSpec.describe ContentConfiguration do describe "default logos and home_hero" do it "sets a default url with existing image" do expect(image_exist?(ContentConfig.url_for(:logo))).to be true diff --git a/spec/models/coordinator_fee_spec.rb b/spec/models/coordinator_fee_spec.rb index 5e3a8765b85..980935c0a91 100644 --- a/spec/models/coordinator_fee_spec.rb +++ b/spec/models/coordinator_fee_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe CoordinatorFee do +RSpec.describe CoordinatorFee do it { is_expected.to belong_to(:order_cycle).required } it { is_expected.to belong_to(:enterprise_fee).required } end diff --git a/spec/models/custom_tab_spec.rb b/spec/models/custom_tab_spec.rb index f192068f634..b35af1c71c6 100644 --- a/spec/models/custom_tab_spec.rb +++ b/spec/models/custom_tab_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe CustomTab do +RSpec.describe CustomTab do describe 'associations' do it { is_expected.to belong_to(:enterprise).required } end diff --git a/spec/models/customer_spec.rb b/spec/models/customer_spec.rb index fc5847239c1..bb488b69936 100644 --- a/spec/models/customer_spec.rb +++ b/spec/models/customer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Customer, type: :model do +RSpec.describe Customer, type: :model do it { is_expected.to belong_to(:enterprise).required } it { is_expected.to belong_to(:user).optional } it { is_expected.to belong_to(:bill_address).optional } diff --git a/spec/models/enterprise_caching_spec.rb b/spec/models/enterprise_caching_spec.rb index e66063abc1f..5f10a523984 100644 --- a/spec/models/enterprise_caching_spec.rb +++ b/spec/models/enterprise_caching_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Enterprise do +RSpec.describe Enterprise do context "key-based caching invalidation" do describe "is touched when a(n)" do let(:enterprise) { create(:distributor_enterprise) } diff --git a/spec/models/enterprise_fee_adjustments_spec.rb b/spec/models/enterprise_fee_adjustments_spec.rb index 8e00118b110..df281deeba0 100644 --- a/spec/models/enterprise_fee_adjustments_spec.rb +++ b/spec/models/enterprise_fee_adjustments_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe EnterpriseFeeAdjustments do +RSpec.describe EnterpriseFeeAdjustments do let(:tax_rate) { create(:tax_rate, amount: 0.1) } let(:line_item) { create(:line_item) } let(:line_item2) { create(:line_item) } diff --git a/spec/models/enterprise_fee_spec.rb b/spec/models/enterprise_fee_spec.rb index 9a81c0d132c..e2881f3a05e 100644 --- a/spec/models/enterprise_fee_spec.rb +++ b/spec/models/enterprise_fee_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe EnterpriseFee do +RSpec.describe EnterpriseFee do describe "associations" do it { is_expected.to belong_to(:enterprise).required } it { is_expected.to belong_to(:tax_category).optional } diff --git a/spec/models/enterprise_group_spec.rb b/spec/models/enterprise_group_spec.rb index 4a74fa65f8f..aa2c10f2edb 100644 --- a/spec/models/enterprise_group_spec.rb +++ b/spec/models/enterprise_group_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe EnterpriseGroup do +RSpec.describe EnterpriseGroup do describe "associations" do subject { build(:enterprise_group) } @@ -118,4 +118,16 @@ end end end + + describe "serialisation" do + it "sanitises HTML in long_description" do + subject.long_description = "Hello dearest monster." + expect(subject.long_description).to eq "Hello alert dearest monster." + end + + it "sanitises existing HTML in long_description" do + subject[:long_description] = "Hello dearest monster." + expect(subject.long_description).to eq "Hello alert dearest monster." + end + end end diff --git a/spec/models/enterprise_relationship_spec.rb b/spec/models/enterprise_relationship_spec.rb index d0abff9ebef..dfdc2df0229 100644 --- a/spec/models/enterprise_relationship_spec.rb +++ b/spec/models/enterprise_relationship_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe EnterpriseRelationship do +RSpec.describe EnterpriseRelationship do describe "scopes" do let(:e1) { create(:enterprise, name: 'A') } let(:e2) { create(:enterprise, name: 'B') } diff --git a/spec/models/enterprise_spec.rb b/spec/models/enterprise_spec.rb index e764c9da73d..6b1fd9059cc 100644 --- a/spec/models/enterprise_spec.rb +++ b/spec/models/enterprise_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Enterprise do +RSpec.describe Enterprise do describe "sending emails" do describe "on creation" do let!(:user) { create(:user) } @@ -57,6 +57,63 @@ expect(EnterpriseRelationship.where(id: [er1, er2])).to be_empty end + it "raises a DeleteRestrictionError on destroy if distributed_orders exist" do + enterprise = create(:distributor_enterprise) + create_list(:order, 2, distributor: enterprise) + + expect do + enterprise.destroy + end.to raise_error(ActiveRecord::DeleteRestrictionError, + /Cannot delete record because of dependent distributed_orders/) + .and change { Spree::Order.count }.by(0) + end + + it "raises an DeleteRestrictionError on destroy if distributor_payment_methods exist" do + enterprise = create(:distributor_enterprise) + create_list(:distributor_payment_method, 2, distributor: enterprise) + + expect do + enterprise.destroy + end.to raise_error(ActiveRecord::DeleteRestrictionError, + /Cannot delete record because of dependent distributor_payment_methods/) + .and change { DistributorPaymentMethod.count }.by(0) + end + + it "raises an DeleteRestrictionError on destroy if distributor_shipping_methods exist" do + enterprise = create(:distributor_enterprise) + create_list(:distributor_shipping_method, 2, distributor: enterprise) + + expect do + enterprise.destroy + end.to raise_error(ActiveRecord::DeleteRestrictionError, + /Cannot delete record because of dependent distributor_shipping_methods/) + .and change { DistributorShippingMethod.count }.by(0) + end + + it "does not destroy enterprise_fees upon destroy" do + enterprise = create(:enterprise) + create_list(:enterprise_fee, 2, enterprise:) + + expect do + enterprise.destroy + end.to raise_error(ActiveRecord::DeleteRestrictionError, + /Cannot delete record because of dependent enterprise_fees/) + .and change { EnterpriseFee.count }.by(0) + end + + it "does not destroy vouchers upon destroy" do + enterprise = create(:enterprise) + (1..2).map do |code| + create(:voucher, enterprise:, code: "new code #{code}") + end + + expect do + enterprise.destroy + end.to raise_error(ActiveRecord::DeleteRestrictionError, + /Cannot delete record because of dependent vouchers/) + .and change { Voucher.count }.by(0) + end + describe "relationships to other enterprises" do let(:e) { create(:distributor_enterprise) } let(:p) { create(:supplier_enterprise) } @@ -341,6 +398,18 @@ end end + describe "serialisation" do + it "sanitises HTML in long_description" do + subject.long_description = "Hello dearest monster." + expect(subject.long_description).to eq "Hello alert dearest monster." + end + + it "sanitises existing HTML in long_description" do + subject[:long_description] = "Hello dearest monster." + expect(subject.long_description).to eq "Hello alert dearest monster." + end + end + describe "callbacks" do it "restores permalink to original value when it is changed and invalid" do e1 = create(:enterprise, permalink: "taken") diff --git a/spec/models/exchange_spec.rb b/spec/models/exchange_spec.rb index 69dd37d3afd..b2a9c92f35a 100644 --- a/spec/models/exchange_spec.rb +++ b/spec/models/exchange_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Exchange do +RSpec.describe Exchange do it "should be valid when built from factory" do expect(build(:exchange)).to be_valid end diff --git a/spec/models/invoice/data_presenter/line_item_spec.rb b/spec/models/invoice/data_presenter/line_item_spec.rb index 14d3df8c9ff..81abe073bda 100644 --- a/spec/models/invoice/data_presenter/line_item_spec.rb +++ b/spec/models/invoice/data_presenter/line_item_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Invoice::DataPresenter::LineItem do +RSpec.describe Invoice::DataPresenter::LineItem do subject(:presenter) { described_class.new(data) } describe "#amount_with_adjustments_without_taxes" do diff --git a/spec/models/invoice/data_presenter_spec.rb b/spec/models/invoice/data_presenter_spec.rb index bd35562762e..555aeeb952c 100644 --- a/spec/models/invoice/data_presenter_spec.rb +++ b/spec/models/invoice/data_presenter_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Invoice::DataPresenter do +RSpec.describe Invoice::DataPresenter do context "#display_date" do let(:invoice) { double(:invoice, date: '2023-08-01') } diff --git a/spec/models/oidc_account_spec.rb b/spec/models/oidc_account_spec.rb index 7d0ef6939e3..f6eb2d792db 100644 --- a/spec/models/oidc_account_spec.rb +++ b/spec/models/oidc_account_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OidcAccount, type: :model do +RSpec.describe OidcAccount, type: :model do describe "associations and validations" do subject { OidcAccount.new( diff --git a/spec/models/order_balance_spec.rb b/spec/models/order_balance_spec.rb index a7f1aedc661..7e3247900f9 100644 --- a/spec/models/order_balance_spec.rb +++ b/spec/models/order_balance_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderBalance do +RSpec.describe OrderBalance do subject(:order_balance) { described_class.new(order) } let(:order) { build(:order) } let(:user) { order.user } diff --git a/spec/models/order_cycle_spec.rb b/spec/models/order_cycle_spec.rb index 912ff2ec154..b673da05e9a 100644 --- a/spec/models/order_cycle_spec.rb +++ b/spec/models/order_cycle_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderCycle do +RSpec.describe OrderCycle do it "should be valid when built from factory" do expect(build(:simple_order_cycle)).to be_valid end @@ -272,7 +272,7 @@ @oc = create(:simple_order_cycle) @d1 = create(:enterprise) - @d2 = create(:enterprise, next_collection_at: '2-8pm Friday') + @d2 = create(:enterprise) @e0 = create(:exchange, order_cycle: @oc, sender: create(:enterprise), receiver: @oc.coordinator, incoming: true) @@ -292,10 +292,6 @@ it "looks up the pickup time on the exchange when present" do expect(@oc.pickup_time_for(@d1)).to eq('5pm Tuesday') end - - it "returns the distributor's default collection time otherwise" do - expect(@oc.pickup_time_for(@d2)).to eq('2-8pm Friday') - end end describe "finding pickup instructions for a distributor" do diff --git a/spec/models/product_import/entry_processor_spec.rb b/spec/models/product_import/entry_processor_spec.rb index 69defea2099..1306080ef8c 100644 --- a/spec/models/product_import/entry_processor_spec.rb +++ b/spec/models/product_import/entry_processor_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ProductImport::EntryProcessor do +RSpec.describe ProductImport::EntryProcessor do let(:importer) { double(:importer) } let(:validator) { double(:validator) } let(:import_settings) { double(:import_settings) } diff --git a/spec/models/product_import/entry_validator_spec.rb b/spec/models/product_import/entry_validator_spec.rb index 46482985450..3f9ef972095 100644 --- a/spec/models/product_import/entry_validator_spec.rb +++ b/spec/models/product_import/entry_validator_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ProductImport::EntryValidator do +RSpec.describe ProductImport::EntryValidator do let(:current_user) { double(:current_user) } let(:import_time) { double(:import_time) } let(:spreadsheet_data) { double(:spreadsheet_data) } diff --git a/spec/models/product_import/inventory_reset_strategy_spec.rb b/spec/models/product_import/inventory_reset_strategy_spec.rb index 3eed6244867..86a0b67de43 100644 --- a/spec/models/product_import/inventory_reset_strategy_spec.rb +++ b/spec/models/product_import/inventory_reset_strategy_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ProductImport::InventoryResetStrategy do +RSpec.describe ProductImport::InventoryResetStrategy do let(:inventory_reset) { described_class.new(excluded_items_ids) } describe '#reset' do diff --git a/spec/models/product_import/reset_absent_spec.rb b/spec/models/product_import/reset_absent_spec.rb index c853d3e79ce..6a1bf2a56ac 100644 --- a/spec/models/product_import/reset_absent_spec.rb +++ b/spec/models/product_import/reset_absent_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module ProductImport - describe ResetAbsent do + RSpec.describe ResetAbsent do let(:entry_processor) { instance_double(EntryProcessor) } let(:reset_absent) do diff --git a/spec/models/product_import/settings_spec.rb b/spec/models/product_import/settings_spec.rb index ab383b89a24..1eaa1195438 100644 --- a/spec/models/product_import/settings_spec.rb +++ b/spec/models/product_import/settings_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ProductImport::Settings do +RSpec.describe ProductImport::Settings do let(:settings) { described_class.new(import_settings) } describe '#defaults' do diff --git a/spec/models/product_importer_spec.rb b/spec/models/product_importer_spec.rb index ff6470d782f..39b65085754 100644 --- a/spec/models/product_importer_spec.rb +++ b/spec/models/product_importer_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'open_food_network/permissions' -describe ProductImport::ProductImporter do +RSpec.describe ProductImport::ProductImporter do let!(:admin) { create(:admin_user) } let!(:user) { create(:user) } let!(:user2) { create(:user) } diff --git a/spec/models/proxy_order_spec.rb b/spec/models/proxy_order_spec.rb index 0061284d5b5..7fe6b76620e 100644 --- a/spec/models/proxy_order_spec.rb +++ b/spec/models/proxy_order_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ProxyOrder, type: :model do +RSpec.describe ProxyOrder, type: :model do describe "cancel" do let(:order_cycle) { create(:simple_order_cycle) } let(:subscription) { create(:subscription) } diff --git a/spec/models/report_blob_spec.rb b/spec/models/report_blob_spec.rb index 7df91b43441..764925ba11a 100644 --- a/spec/models/report_blob_spec.rb +++ b/spec/models/report_blob_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ReportBlob, type: :model do +RSpec.describe ReportBlob, type: :model do it "preserves UTF-8 content" do content = "This works. ✓" diff --git a/spec/models/spree/ability_spec.rb b/spec/models/spree/ability_spec.rb index b787e64a879..9ff691368e3 100644 --- a/spec/models/spree/ability_spec.rb +++ b/spec/models/spree/ability_spec.rb @@ -4,7 +4,7 @@ require 'cancan/matchers' require 'support/ability_helpers' -describe Spree::Ability do +RSpec.describe Spree::Ability do let(:user) { create(:user) } let(:subject) { Spree::Ability.new(user) } let(:token) { nil } diff --git a/spec/models/spree/address_spec.rb b/spec/models/spree/address_spec.rb index 41d0a28b154..712a4ad6ed5 100644 --- a/spec/models/spree/address_spec.rb +++ b/spec/models/spree/address_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Address do +RSpec.describe Spree::Address do describe "clone" do it "creates a copy of the address with the exception of the id, " \ "updated_at and created_at attributes" do @@ -134,6 +134,17 @@ end end + context "associations" do + it "destroys shipments upon destroy" do + address = create(:address) + create(:shipment, address:) + + expect { + address.destroy + }.to raise_error(ActiveRecord::DeleteRestrictionError) + end + end + context ".default" do it "sets up a new record the default country" do expect(Spree::Address.default.country).to eq DefaultCountry.country diff --git a/spec/models/spree/addresses_spec.rb b/spec/models/spree/addresses_spec.rb index 1b76aa51cec..e2aa0ea9e6d 100644 --- a/spec/models/spree/addresses_spec.rb +++ b/spec/models/spree/addresses_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Address do +RSpec.describe Spree::Address do let(:address) { build(:address) } let(:enterprise_address) { build(:address, enterprise: build(:enterprise)) } diff --git a/spec/models/spree/adjustment_spec.rb b/spec/models/spree/adjustment_spec.rb index f3e08d06fe0..9682d045ee8 100644 --- a/spec/models/spree/adjustment_spec.rb +++ b/spec/models/spree/adjustment_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe Adjustment do + RSpec.describe Adjustment do let(:order) { build(:order) } let(:adjustment) { Spree::Adjustment.create(label: "Adjustment", amount: 5) } diff --git a/spec/models/spree/app_configuration_spec.rb b/spec/models/spree/app_configuration_spec.rb index 607dc8501bb..9a0843fb303 100644 --- a/spec/models/spree/app_configuration_spec.rb +++ b/spec/models/spree/app_configuration_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::AppConfiguration do +RSpec.describe Spree::AppConfiguration do let(:prefs) { Rails.application.config.spree.preferences } it "should be available from the environment" do diff --git a/spec/models/spree/asset_spec.rb b/spec/models/spree/asset_spec.rb index d8567c4d74c..22685372562 100644 --- a/spec/models/spree/asset_spec.rb +++ b/spec/models/spree/asset_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Asset do +RSpec.describe Spree::Asset do describe "#viewable" do it "touches association" do product = create(:product) diff --git a/spec/models/spree/calculator_spec.rb b/spec/models/spree/calculator_spec.rb index a2e8daf9123..85d6c4a908d 100644 --- a/spec/models/spree/calculator_spec.rb +++ b/spec/models/spree/calculator_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe Calculator do + RSpec.describe Calculator do let(:calculator) { Spree::Calculator.new } let!(:enterprise) { create(:enterprise) } let!(:order) { create(:order) } diff --git a/spec/models/spree/credit_card_spec.rb b/spec/models/spree/credit_card_spec.rb index 1a0468ec286..749bdea4605 100644 --- a/spec/models/spree/credit_card_spec.rb +++ b/spec/models/spree/credit_card_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe CreditCard do + RSpec.describe CreditCard do let(:valid_credit_card_attributes) { { number: '4111111111111111', diff --git a/spec/models/spree/gateway/stripe_sca_spec.rb b/spec/models/spree/gateway/stripe_sca_spec.rb index f3191c09d46..1b9c28863ed 100644 --- a/spec/models/spree/gateway/stripe_sca_spec.rb +++ b/spec/models/spree/gateway/stripe_sca_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Gateway::StripeSCA, :vcr, :stripe_version, type: :model do +RSpec.describe Spree::Gateway::StripeSCA, :vcr, :stripe_version, type: :model do let(:order) { create(:order_ready_for_payment) } let(:year_valid) { Time.zone.now.year.next } diff --git a/spec/models/spree/gateway_spec.rb b/spec/models/spree/gateway_spec.rb index 9bf43378f4f..23b0b97d96c 100644 --- a/spec/models/spree/gateway_spec.rb +++ b/spec/models/spree/gateway_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Gateway do +RSpec.describe Spree::Gateway do let(:test_gateway) do Class.new(Spree::Gateway) do def provider_class diff --git a/spec/models/spree/gateway_tagging_spec.rb b/spec/models/spree/gateway_tagging_spec.rb index 410ef1ec355..6ba82372e36 100644 --- a/spec/models/spree/gateway_tagging_spec.rb +++ b/spec/models/spree/gateway_tagging_spec.rb @@ -8,7 +8,7 @@ # # This spec tests several descendants for their taggability. The tests are in # a separate file, because they cover one aspect of several classes. -shared_examples "taggable" do |expected_taggable_type| +RSpec.shared_examples "taggable" do |expected_taggable_type| it "provides a tag list" do expect(subject.tag_list).to eq [] end @@ -22,7 +22,7 @@ end module Spree - describe "PaymentMethod and descendants" do + RSpec.describe "PaymentMethod and descendants" do let(:shop) { create(:enterprise) } let(:valid_subject) do # Supply required parameters so that it can be saved to attach taggings. diff --git a/spec/models/spree/image_spec.rb b/spec/models/spree/image_spec.rb index d20ab9eb715..10fd719f1dc 100644 --- a/spec/models/spree/image_spec.rb +++ b/spec/models/spree/image_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe Image do + RSpec.describe Image do include FileHelper subject { diff --git a/spec/models/spree/inventory_unit_spec.rb b/spec/models/spree/inventory_unit_spec.rb index 964e57c4c4c..e4743b652ea 100644 --- a/spec/models/spree/inventory_unit_spec.rb +++ b/spec/models/spree/inventory_unit_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::InventoryUnit do +RSpec.describe Spree::InventoryUnit do let(:stock_location) { create(:stock_location_with_items) } let(:stock_item) { stock_location.stock_items.order(:id).first } diff --git a/spec/models/spree/line_item_spec.rb b/spec/models/spree/line_item_spec.rb index fbc6f753c54..f68e2555d1f 100644 --- a/spec/models/spree/line_item_spec.rb +++ b/spec/models/spree/line_item_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe LineItem do + RSpec.describe LineItem do let(:order) { create :order_with_line_items, line_items_count: 1 } let(:line_item) { order.line_items.first } @@ -664,7 +664,7 @@ module Spree before { allow(li).to receive(:product) { p } } context "when full_name starts with the product name" do - before { allow(li).to receive(:full_name) { p.name + " - something" } } + before { allow(li).to receive(:full_name) { "#{p.name} - something" } } it "does not show the product name twice" do expect(li.product_and_full_name).to eq('product - something') @@ -803,7 +803,7 @@ module Spree end end - describe "searching with ransack" do + RSpec.describe "searching with ransack" do let(:order_cycle1) { create(:order_cycle) } let(:order_cycle2) { create(:order_cycle) } let(:product1) { create(:product, supplier: create(:supplier_enterprise)) } diff --git a/spec/models/spree/order/address_spec.rb b/spec/models/spree/order/address_spec.rb index 78ad56a0efb..d85110c43b4 100644 --- a/spec/models/spree/order/address_spec.rb +++ b/spec/models/spree/order/address_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Order do +RSpec.describe Spree::Order do let(:order) { Spree::Order.new } context 'validation' do diff --git a/spec/models/spree/order/adjustments_spec.rb b/spec/models/spree/order/adjustments_spec.rb index 4c2daf5adef..a2048220614 100644 --- a/spec/models/spree/order/adjustments_spec.rb +++ b/spec/models/spree/order/adjustments_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Order do +RSpec.describe Spree::Order do let(:order) { Spree::Order.new } context "totaling adjustments" do diff --git a/spec/models/spree/order/callbacks_spec.rb b/spec/models/spree/order/callbacks_spec.rb index ed5b4c2c357..9918b93157e 100644 --- a/spec/models/spree/order/callbacks_spec.rb +++ b/spec/models/spree/order/callbacks_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Order do +RSpec.describe Spree::Order do let(:order) { build(:order) } before do Spree::Order.define_state_machine! diff --git a/spec/models/spree/order/checkout_spec.rb b/spec/models/spree/order/checkout_spec.rb index a8686917b21..1925b1ac15b 100644 --- a/spec/models/spree/order/checkout_spec.rb +++ b/spec/models/spree/order/checkout_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Order::Checkout do +RSpec.describe Spree::Order::Checkout do let(:order) { Spree::Order.new } context "with default state machine" do diff --git a/spec/models/spree/order/payment_spec.rb b/spec/models/spree/order/payment_spec.rb index 2eb15a022c3..2e3af6e9536 100644 --- a/spec/models/spree/order/payment_spec.rb +++ b/spec/models/spree/order/payment_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe Spree::Order do + RSpec.describe Spree::Order do before { Stripe.api_key = "sk_test_12345" } let(:order) { build(:order) } let(:updater) { OrderManagement::Order::Updater.new(order) } diff --git a/spec/models/spree/order/state_machine_spec.rb b/spec/models/spree/order/state_machine_spec.rb index 80bada4c868..b0a03d17eb7 100644 --- a/spec/models/spree/order/state_machine_spec.rb +++ b/spec/models/spree/order/state_machine_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Order do +RSpec.describe Spree::Order do let(:order) { Spree::Order.new } before do # Ensure state machine has been re-defined correctly @@ -21,13 +21,17 @@ end context "when payment processing succeeds" do - before { allow(order).to receive_messages process_payments!: true } - it "should finalize order when transitioning to complete state" do order.next - expect(order.state).to eq "confirmation" - expect(order).to receive(:finalize!) - order.next! + + expect { + order.next! + }.to change { + order.state + }.from("confirmation").to("complete") + .and change { + order.completed_at + } end context "when credit card processing fails" do @@ -35,9 +39,15 @@ it "should still complete the order" do order.next - expect(order.state).to eq "confirmation" - order.next - expect(order.state).to eq "complete" + + expect { + order.next! + }.to change { + order.state + }.from("confirmation").to("complete") + .and change { + order.completed_at + } end end end @@ -100,9 +110,9 @@ end before do - allow(order).to receive_messages line_items: [build(:line_item, variant:, - quantity: 2)] - allow(order.line_items).to receive_messages find_by_variant_id: order.line_items.first + allow(order).to receive_messages line_items: [ + build(:line_item, variant:, quantity: 2) + ] allow(order).to receive_messages completed?: true allow(order).to receive_messages allow_cancel?: true @@ -111,7 +121,6 @@ it "should send a cancel email" do # Stub methods that cause side-effects in this test allow(shipment).to receive(:cancel!) - allow(order).to receive :restock_items! mail_message = double "Mail::Message" order_id = nil expect(Spree::OrderMailer).to receive(:cancel_email) { |*args| @@ -137,7 +146,6 @@ # Stubs methods that cause unwanted side effects in this test allow(Spree::OrderMailer).to receive(:cancel_email).and_return(mail_message = double) allow(mail_message).to receive :deliver_later - allow(order).to receive :restock_items! allow(shipment).to receive(:cancel!) end diff --git a/spec/models/spree/order/tax_spec.rb b/spec/models/spree/order/tax_spec.rb index 1e1bb80f7c4..39cae128486 100644 --- a/spec/models/spree/order/tax_spec.rb +++ b/spec/models/spree/order/tax_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe Spree::Order do + RSpec.describe Spree::Order do let(:order) { build(:order) } context "#tax_zone" do diff --git a/spec/models/spree/order_contents_spec.rb b/spec/models/spree/order_contents_spec.rb index 4355a4f8a75..b31d685ea38 100644 --- a/spec/models/spree/order_contents_spec.rb +++ b/spec/models/spree/order_contents_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::OrderContents do +RSpec.describe Spree::OrderContents do let!(:order) { create(:order) } let!(:variant) { create(:variant) } subject { described_class.new(order) } diff --git a/spec/models/spree/order_inventory_spec.rb b/spec/models/spree/order_inventory_spec.rb index b363fa62bb2..0aa07585f5a 100644 --- a/spec/models/spree/order_inventory_spec.rb +++ b/spec/models/spree/order_inventory_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::OrderInventory do +RSpec.describe Spree::OrderInventory do let(:order) { create :completed_order_with_totals } let(:line_item) { order.line_items.first } subject { described_class.new(order) } diff --git a/spec/models/spree/order_spec.rb b/spec/models/spree/order_spec.rb index 3a0dfb7d3c8..ec49b695cd4 100644 --- a/spec/models/spree/order_spec.rb +++ b/spec/models/spree/order_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Order do +RSpec.describe Spree::Order do let(:user) { build(:user, email: "spree@example.com") } let(:order) { build(:order, user:) } @@ -258,7 +258,6 @@ end it "should freeze all adjustments" do - allow(Spree::OrderMailer).to receive_message_chain :confirm_email, :deliver_later adjustments = double allow(order).to receive_messages all_adjustments: adjustments expect(adjustments).to receive(:update_all).with(state: 'closed') @@ -440,8 +439,6 @@ context "empty!" do it "should clear out all line items and adjustments" do order = build(:order) - allow(order).to receive_messages(line_items: line_items = []) - allow(order).to receive_messages(adjustments: adjustments = []) expect(order.line_items).to receive(:destroy_all) expect(order.all_adjustments).to receive(:destroy_all) diff --git a/spec/models/spree/payment_method_spec.rb b/spec/models/spree/payment_method_spec.rb index 634ed0d672e..877164f8b4e 100644 --- a/spec/models/spree/payment_method_spec.rb +++ b/spec/models/spree/payment_method_spec.rb @@ -5,7 +5,7 @@ class Spree::Gateway::Test < Spree::Gateway end -describe Spree::PaymentMethod do +RSpec.describe Spree::PaymentMethod do describe ".managed_by scope" do subject! { create(:payment_method) } let(:owner) { subject.distributors.first.owner } diff --git a/spec/models/spree/payment_spec.rb b/spec/models/spree/payment_spec.rb index 26edb058adb..be09f525390 100644 --- a/spec/models/spree/payment_spec.rb +++ b/spec/models/spree/payment_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Payment do +RSpec.describe Spree::Payment do context 'original specs from Spree' do before { Stripe.api_key = "sk_test_12345" } let(:order) { create(:order) } diff --git a/spec/models/spree/preference_spec.rb b/spec/models/spree/preference_spec.rb index b70cf1bc1a1..636c1d15c99 100644 --- a/spec/models/spree/preference_spec.rb +++ b/spec/models/spree/preference_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Preference do +RSpec.describe Spree::Preference do it "should require a key" do @preference = Spree::Preference.new @preference.key = :test diff --git a/spec/models/spree/preferences/configuration_spec.rb b/spec/models/spree/preferences/configuration_spec.rb index fc4b51a7095..a309883dcde 100644 --- a/spec/models/spree/preferences/configuration_spec.rb +++ b/spec/models/spree/preferences/configuration_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Preferences::Configuration do +RSpec.describe Spree::Preferences::Configuration do let(:config) do Class.new(Spree::Preferences::Configuration) do preference :color, :string, default: :blue diff --git a/spec/models/spree/preferences/preferable_spec.rb b/spec/models/spree/preferences/preferable_spec.rb index 4cf412c3926..465b4f858ea 100644 --- a/spec/models/spree/preferences/preferable_spec.rb +++ b/spec/models/spree/preferences/preferable_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Preferences::Preferable do +RSpec.describe Spree::Preferences::Preferable do a_class = A = Class.new do include Spree::Preferences::Preferable diff --git a/spec/models/spree/preferences/store_spec.rb b/spec/models/spree/preferences/store_spec.rb index 7d5995e97ab..d8d2b4d1ecd 100644 --- a/spec/models/spree/preferences/store_spec.rb +++ b/spec/models/spree/preferences/store_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Preferences::Store do +RSpec.describe Spree::Preferences::Store do before :each do @store = Spree::Preferences::StoreInstance.new end diff --git a/spec/models/spree/price_spec.rb b/spec/models/spree/price_spec.rb index d0fd0ad44f4..441a7a185b5 100644 --- a/spec/models/spree/price_spec.rb +++ b/spec/models/spree/price_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe Price do + RSpec.describe Price do let(:variant) { create(:variant) } let(:price) { variant.default_price } diff --git a/spec/models/spree/product_property_spec.rb b/spec/models/spree/product_property_spec.rb index c99820f815f..1af2043ac0e 100644 --- a/spec/models/spree/product_property_spec.rb +++ b/spec/models/spree/product_property_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::ProductProperty do +RSpec.describe Spree::ProductProperty do context "validations" do it "should validate length of value" do pp = create(:product_property) diff --git a/spec/models/spree/product_spec.rb b/spec/models/spree/product_spec.rb index 7efd2da0240..a19b853859f 100644 --- a/spec/models/spree/product_spec.rb +++ b/spec/models/spree/product_spec.rb @@ -4,14 +4,14 @@ require 'spree/core/product_duplicator' module Spree - describe Product do + RSpec.describe Product do context 'product instance' do let(:product) { create(:product) } context '#duplicate' do it 'duplicates product' do clone = product.duplicate - expect(clone.name).to eq 'COPY OF ' + product.name + expect(clone.name).to eq "COPY OF #{product.name}" expect(clone.sku).to eq "" expect(clone.image).to eq product.image end @@ -748,9 +748,21 @@ module Spree expect(e.variants.reload).to be_empty end end + + describe "serialisation" do + it "sanitises HTML in description" do + subject.description = "Hello dearest monster." + expect(subject.description).to eq "Hello alert dearest monster." + end + + it "sanitises existing HTML in description" do + subject[:description] = "Hello dearest monster." + expect(subject.description).to eq "Hello alert dearest monster." + end + end end - describe "product import" do + RSpec.describe "product import" do describe "finding the most recent import date of the variants" do let!(:product) { create(:product) } diff --git a/spec/models/spree/return_authorization_spec.rb b/spec/models/spree/return_authorization_spec.rb index 68249cedc34..2d0c0df31c3 100644 --- a/spec/models/spree/return_authorization_spec.rb +++ b/spec/models/spree/return_authorization_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::ReturnAuthorization do +RSpec.describe Spree::ReturnAuthorization do let(:order) { create(:shipped_order) } let(:variant) { order.shipments.first.inventory_units.first.variant } let(:return_authorization) { Spree::ReturnAuthorization.new(order:) } diff --git a/spec/models/spree/shipment_spec.rb b/spec/models/spree/shipment_spec.rb index fc2b31b2721..4b4f70318c2 100644 --- a/spec/models/spree/shipment_spec.rb +++ b/spec/models/spree/shipment_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'benchmark' -describe Spree::Shipment do +RSpec.describe Spree::Shipment do let(:order) { build(:order) } let(:shipping_method) { build(:shipping_method, name: "UPS") } let(:shipment) do diff --git a/spec/models/spree/shipping_method_spec.rb b/spec/models/spree/shipping_method_spec.rb index 839367c8d1c..0a894676119 100644 --- a/spec/models/spree/shipping_method_spec.rb +++ b/spec/models/spree/shipping_method_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe ShippingMethod do + RSpec.describe ShippingMethod do it "is valid when built from factory" do expect( build( diff --git a/spec/models/spree/shipping_rate_spec.rb b/spec/models/spree/shipping_rate_spec.rb index 5090d285e91..3343355edfa 100644 --- a/spec/models/spree/shipping_rate_spec.rb +++ b/spec/models/spree/shipping_rate_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::ShippingRate do +RSpec.describe Spree::ShippingRate do let(:shipment) { create(:shipment) } let(:shipping_method) { build_stubbed(:shipping_method) } let(:shipping_rate) { diff --git a/spec/models/spree/state_spec.rb b/spec/models/spree/state_spec.rb index 47a3b8552de..efe83bc41ee 100644 --- a/spec/models/spree/state_spec.rb +++ b/spec/models/spree/state_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::State do +RSpec.describe Spree::State do before(:all) do Spree::State.destroy_all end diff --git a/spec/models/spree/stock/availability_validator_spec.rb b/spec/models/spree/stock/availability_validator_spec.rb index d7e39ed1756..91a7f0a2fec 100644 --- a/spec/models/spree/stock/availability_validator_spec.rb +++ b/spec/models/spree/stock/availability_validator_spec.rb @@ -4,7 +4,7 @@ module Spree module Stock - describe AvailabilityValidator do + RSpec.describe AvailabilityValidator do let(:validator) { AvailabilityValidator.new({}) } context "line item without existing inventory units" do diff --git a/spec/models/spree/stock/quantifier_spec.rb b/spec/models/spree/stock/quantifier_spec.rb index 2a06f743441..d697a668d8f 100644 --- a/spec/models/spree/stock/quantifier_spec.rb +++ b/spec/models/spree/stock/quantifier_spec.rb @@ -4,7 +4,7 @@ module Spree module Stock - describe Quantifier do + RSpec.describe Quantifier do let(:quantifier) { Spree::Stock::Quantifier.new(variant) } let(:variant) { create(:variant, on_hand: 99) } diff --git a/spec/models/spree/stock_item_spec.rb b/spec/models/spree/stock_item_spec.rb index d3b1b26bab0..c3f94ef71ad 100644 --- a/spec/models/spree/stock_item_spec.rb +++ b/spec/models/spree/stock_item_spec.rb @@ -109,8 +109,8 @@ context "with stock movements" do before { Spree::StockMovement.create(stock_item: subject, quantity: 1) } - it "doesnt raise ReadOnlyRecord error" do - expect { subject.destroy }.not_to raise_error + it "does not destroy stock_movements when destroyed" do + expect { subject.destroy }.to change { Spree::StockMovement.count }.by(-1) end end end diff --git a/spec/models/spree/stock_location_spec.rb b/spec/models/spree/stock_location_spec.rb index 86996b40b48..1efad18c9b7 100644 --- a/spec/models/spree/stock_location_spec.rb +++ b/spec/models/spree/stock_location_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe StockLocation do + RSpec.describe StockLocation do subject { create(:stock_location_with_items, backorderable_default: true) } let(:stock_item) { subject.stock_items.order(:id).first } let(:variant) { stock_item.variant } diff --git a/spec/models/spree/stock_movement_spec.rb b/spec/models/spree/stock_movement_spec.rb index 95f0ea5564d..19ff09341c9 100644 --- a/spec/models/spree/stock_movement_spec.rb +++ b/spec/models/spree/stock_movement_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::StockMovement do +RSpec.describe Spree::StockMovement do let(:stock_location) { create(:stock_location_with_items) } let(:stock_item) { stock_location.stock_items.order(:id).first } subject { build(:stock_movement, stock_item:) } @@ -11,13 +11,6 @@ expect(subject).to respond_to(:stock_item) end - it 'is readonly unless new' do - subject.save - expect { - subject.save - }.to raise_error(ActiveRecord::ReadOnlyRecord) - end - context "when quantity is negative" do context "after save" do it "should decrement the stock item count on hand" do diff --git a/spec/models/spree/tax_category_spec.rb b/spec/models/spree/tax_category_spec.rb index 77e9a02501c..ce86c940179 100644 --- a/spec/models/spree/tax_category_spec.rb +++ b/spec/models/spree/tax_category_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::TaxCategory do +RSpec.describe Spree::TaxCategory do context 'default tax category' do let(:tax_category) { create(:tax_category) } let(:new_tax_category) { create(:tax_category) } diff --git a/spec/models/spree/tax_rate_spec.rb b/spec/models/spree/tax_rate_spec.rb index 5437ab21825..9d58cd024bc 100644 --- a/spec/models/spree/tax_rate_spec.rb +++ b/spec/models/spree/tax_rate_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe TaxRate do + RSpec.describe TaxRate do describe "#match" do let!(:zone) { create(:zone_with_member) } let!(:order) { create(:order, distributor: hub, bill_address: create(:address)) } diff --git a/spec/models/spree/taxon_spec.rb b/spec/models/spree/taxon_spec.rb index 7f481413dff..34bdda43951 100644 --- a/spec/models/spree/taxon_spec.rb +++ b/spec/models/spree/taxon_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Spree - describe Taxon do + RSpec.describe Taxon do let(:taxon) { Spree::Taxon.new(name: "Ruby on Rails") } let(:e) { create(:supplier_enterprise) } diff --git a/spec/models/spree/taxonomy_spec.rb b/spec/models/spree/taxonomy_spec.rb index 2ead3dcc0ec..1ace1383134 100644 --- a/spec/models/spree/taxonomy_spec.rb +++ b/spec/models/spree/taxonomy_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Taxonomy do +RSpec.describe Spree::Taxonomy do context "#destroy" do before do @taxonomy = create(:taxonomy) diff --git a/spec/models/spree/user_spec.rb b/spec/models/spree/user_spec.rb index 368792f8ed0..c53b8d7845b 100644 --- a/spec/models/spree/user_spec.rb +++ b/spec/models/spree/user_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::User do +RSpec.describe Spree::User do describe "associations" do it { is_expected.to have_many(:owned_enterprises) } it { is_expected.to have_many(:webhook_endpoints).dependent(:destroy) } diff --git a/spec/models/spree/variant_spec.rb b/spec/models/spree/variant_spec.rb index 1771e860a15..3cea5ba96f7 100644 --- a/spec/models/spree/variant_spec.rb +++ b/spec/models/spree/variant_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'spree/localized_number' -describe Spree::Variant do +RSpec.describe Spree::Variant do subject(:variant) { build(:variant) } it { is_expected.to have_many :semantic_links } @@ -58,6 +58,28 @@ end end + describe "#changed?" do + subject(:variant) { create(:variant) } + + it { is_expected.not_to be_changed } + + it "is changed when basic fields are changed" do + subject.display_name = "blah" + expect(subject).to be_changed + end + + describe "default_price" do + it "price" do + subject.price = 100 + expect(subject).to be_changed + end + it "currency" do + subject.currency = "USD" + expect(subject).to be_changed + end + end + end + context "price parsing" do context "price=" do context "with decimal point" do diff --git a/spec/models/spree/zone_spec.rb b/spec/models/spree/zone_spec.rb index ce28024cafd..9be11552ad9 100644 --- a/spec/models/spree/zone_spec.rb +++ b/spec/models/spree/zone_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Spree::Zone do +RSpec.describe Spree::Zone do context "#match" do let(:country_zone) { create(:zone, name: 'CountryZone') } let(:country) do diff --git a/spec/models/stripe_account_spec.rb b/spec/models/stripe_account_spec.rb index 1de1df4b50f..9614344eb1b 100644 --- a/spec/models/stripe_account_spec.rb +++ b/spec/models/stripe_account_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'stripe/oauth' -describe StripeAccount do +RSpec.describe StripeAccount do describe "deauthorize_and_destroy", :vcr, :stripe_version do let!(:enterprise) { create(:enterprise) } let!(:enterprise2) { create(:enterprise) } diff --git a/spec/models/subscription_line_item_spec.rb b/spec/models/subscription_line_item_spec.rb index bc31544cbc3..473c04a1a59 100644 --- a/spec/models/subscription_line_item_spec.rb +++ b/spec/models/subscription_line_item_spec.rb @@ -2,14 +2,14 @@ require 'spec_helper' -describe SubscriptionLineItem, model: true do +RSpec.describe SubscriptionLineItem, model: true do describe "validations" do it "requires a subscription" do - expect(subject).to validate_presence_of :subscription + expect(subject).to belong_to :subscription end it "requires a variant" do - expect(subject).to validate_presence_of :variant + expect(subject).to belong_to :variant end it "requires a integer for quantity" do diff --git a/spec/models/subscription_spec.rb b/spec/models/subscription_spec.rb index 29e2d0c22e5..b4e3eee043a 100644 --- a/spec/models/subscription_spec.rb +++ b/spec/models/subscription_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Subscription, type: :model do +RSpec.describe Subscription, type: :model do describe "associations" do it { expect(subject).to belong_to(:shop).optional } it { expect(subject).to belong_to(:customer).optional } diff --git a/spec/models/tag_rule/filter_order_cycles_spec.rb b/spec/models/tag_rule/filter_order_cycles_spec.rb index 661b18b8af6..c5fbbfe12aa 100644 --- a/spec/models/tag_rule/filter_order_cycles_spec.rb +++ b/spec/models/tag_rule/filter_order_cycles_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe TagRule::FilterOrderCycles, type: :model do +RSpec.describe TagRule::FilterOrderCycles, type: :model do let!(:tag_rule) { build_stubbed(:filter_order_cycles_tag_rule) } describe "determining whether tags match for a given exchange" do diff --git a/spec/models/tag_rule/filter_payment_methods_spec.rb b/spec/models/tag_rule/filter_payment_methods_spec.rb index 59d39aaacfc..c7d88ad4ede 100644 --- a/spec/models/tag_rule/filter_payment_methods_spec.rb +++ b/spec/models/tag_rule/filter_payment_methods_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe TagRule::FilterPaymentMethods, type: :model do +RSpec.describe TagRule::FilterPaymentMethods, type: :model do let!(:tag_rule) { build_stubbed(:filter_payment_methods_tag_rule) } describe "determining whether tags match for a given payment method" do diff --git a/spec/models/tag_rule/filter_products_spec.rb b/spec/models/tag_rule/filter_products_spec.rb index f0a8bcc31b6..ae844564c3f 100644 --- a/spec/models/tag_rule/filter_products_spec.rb +++ b/spec/models/tag_rule/filter_products_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe TagRule::FilterProducts, type: :model do +RSpec.describe TagRule::FilterProducts, type: :model do let!(:tag_rule) { build_stubbed(:filter_products_tag_rule) } describe "determining whether tags match for a given variant" do diff --git a/spec/models/tag_rule/filter_shipping_methods_spec.rb b/spec/models/tag_rule/filter_shipping_methods_spec.rb index 3a6b410b60e..7276059b8e9 100644 --- a/spec/models/tag_rule/filter_shipping_methods_spec.rb +++ b/spec/models/tag_rule/filter_shipping_methods_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe TagRule::FilterShippingMethods, type: :model do +RSpec.describe TagRule::FilterShippingMethods, type: :model do let!(:tag_rule) { build_stubbed(:filter_shipping_methods_tag_rule) } describe "determining whether tags match for a given shipping method" do diff --git a/spec/models/tag_rule_spec.rb b/spec/models/tag_rule_spec.rb index 86eed9d14bf..738263cf343 100644 --- a/spec/models/tag_rule_spec.rb +++ b/spec/models/tag_rule_spec.rb @@ -2,10 +2,10 @@ require 'spec_helper' -describe TagRule, type: :model do +RSpec.describe TagRule, type: :model do describe "validations" do it "requires a enterprise" do - expect(subject).to validate_presence_of(:enterprise) + expect(subject).to belong_to(:enterprise) end end end diff --git a/spec/models/terms_of_service_file_spec.rb b/spec/models/terms_of_service_file_spec.rb index 19d9fb183d9..f25c0adf2aa 100644 --- a/spec/models/terms_of_service_file_spec.rb +++ b/spec/models/terms_of_service_file_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe TermsOfServiceFile do +RSpec.describe TermsOfServiceFile do include FileHelper let(:upload) { terms_pdf_file } diff --git a/spec/models/variant_override_spec.rb b/spec/models/variant_override_spec.rb index 2da715f80a1..15c9a1f4bf6 100644 --- a/spec/models/variant_override_spec.rb +++ b/spec/models/variant_override_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe VariantOverride do +RSpec.describe VariantOverride do let(:variant) { create(:variant) } let(:hub) { create(:distributor_enterprise) } diff --git a/spec/models/voucher_spec.rb b/spec/models/voucher_spec.rb index aef0db2194e..6af5c6b5bdb 100644 --- a/spec/models/voucher_spec.rb +++ b/spec/models/voucher_spec.rb @@ -7,7 +7,7 @@ module Vouchers class TestVoucher < Voucher; end end -describe Voucher do +RSpec.describe Voucher do let(:enterprise) { build(:enterprise) } describe 'associations' do diff --git a/spec/models/vouchers/flat_rate_spec.rb b/spec/models/vouchers/flat_rate_spec.rb index 419a103534c..92947847461 100644 --- a/spec/models/vouchers/flat_rate_spec.rb +++ b/spec/models/vouchers/flat_rate_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Vouchers::FlatRate do +RSpec.describe Vouchers::FlatRate do describe 'validations' do subject { build(:voucher_flat_rate) } diff --git a/spec/models/vouchers/percentage_rate_spec.rb b/spec/models/vouchers/percentage_rate_spec.rb index e2e136bd14a..b172baf0167 100644 --- a/spec/models/vouchers/percentage_rate_spec.rb +++ b/spec/models/vouchers/percentage_rate_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Vouchers::PercentageRate do +RSpec.describe Vouchers::PercentageRate do describe 'validations' do subject { build(:voucher_percentage_rate) } diff --git a/spec/models/webhook_endpoint_spec.rb b/spec/models/webhook_endpoint_spec.rb index 5f1d630f099..0150037a3fb 100644 --- a/spec/models/webhook_endpoint_spec.rb +++ b/spec/models/webhook_endpoint_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe WebhookEndpoint, type: :model do +RSpec.describe WebhookEndpoint, type: :model do describe "validations" do it { is_expected.to validate_presence_of(:url) } end diff --git a/spec/queries/batch_taggable_tags_query_spec.rb b/spec/queries/batch_taggable_tags_query_spec.rb index 2bb63926eaf..991ce002583 100644 --- a/spec/queries/batch_taggable_tags_query_spec.rb +++ b/spec/queries/batch_taggable_tags_query_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe BatchTaggableTagsQuery do +RSpec.describe BatchTaggableTagsQuery do it "fetches tags for multiple models in one query" do customer_i = create(:customer, tag_list: "member,volunteer") customer_ii = create(:customer, tag_list: "member") diff --git a/spec/queries/complete_orders_with_balance_query_spec.rb b/spec/queries/complete_orders_with_balance_query_spec.rb index 0f7e8568656..1f788669e11 100644 --- a/spec/queries/complete_orders_with_balance_query_spec.rb +++ b/spec/queries/complete_orders_with_balance_query_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe CompleteOrdersWithBalanceQuery do +RSpec.describe CompleteOrdersWithBalanceQuery do subject(:result) { described_class.new(user).call } describe '#call' do diff --git a/spec/queries/complete_visible_orders_query_spec.rb b/spec/queries/complete_visible_orders_query_spec.rb index af7d54872f8..a39de73bdf7 100644 --- a/spec/queries/complete_visible_orders_query_spec.rb +++ b/spec/queries/complete_visible_orders_query_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe CompleteVisibleOrdersQuery do +RSpec.describe CompleteVisibleOrdersQuery do subject(:result) { described_class.new(order_permissions).call } let(:filter_canceled) { false } diff --git a/spec/queries/customers_with_balance_query_spec.rb b/spec/queries/customers_with_balance_query_spec.rb index 47811e21ce7..a71adb7479e 100644 --- a/spec/queries/customers_with_balance_query_spec.rb +++ b/spec/queries/customers_with_balance_query_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe CustomersWithBalanceQuery do +RSpec.describe CustomersWithBalanceQuery do subject(:result) { described_class.new(Customer.where(id: customers)).call } describe '#call' do diff --git a/spec/queries/outstanding_balance_query_spec.rb b/spec/queries/outstanding_balance_query_spec.rb index 77e9acb3075..a79b209da07 100644 --- a/spec/queries/outstanding_balance_query_spec.rb +++ b/spec/queries/outstanding_balance_query_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OutstandingBalanceQuery do +RSpec.describe OutstandingBalanceQuery do subject(:query) { described_class.new(relation) } let(:result) { query.call } diff --git a/spec/queries/payments_requiring_action_query_spec.rb b/spec/queries/payments_requiring_action_query_spec.rb index 4101a181ca1..d18a8618022 100644 --- a/spec/queries/payments_requiring_action_query_spec.rb +++ b/spec/queries/payments_requiring_action_query_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe PaymentsRequiringActionQuery do +RSpec.describe PaymentsRequiringActionQuery do subject(:result) { described_class.new(user).call } let(:user) { create(:user) } diff --git a/spec/queries/product_scope_query_spec.rb b/spec/queries/product_scope_query_spec.rb index 9674a201f5e..197ec23aadc 100755 --- a/spec/queries/product_scope_query_spec.rb +++ b/spec/queries/product_scope_query_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ProductScopeQuery do +RSpec.describe ProductScopeQuery do let!(:taxon) { create(:taxon) } let(:supplier) { create(:supplier_enterprise) } let(:supplier2) { create(:supplier_enterprise) } diff --git a/spec/reflexes/products_reflex_spec.rb b/spec/reflexes/products_reflex_spec.rb deleted file mode 100644 index 97bf6171616..00000000000 --- a/spec/reflexes/products_reflex_spec.rb +++ /dev/null @@ -1,99 +0,0 @@ -# frozen_string_literal: true - -require "reflex_helper" - -describe ProductsReflex, type: :reflex, feature: :admin_style_v3 do - let(:current_user) { create(:admin_user) } # todo: set up an enterprise user to test permissions - let(:context) { - { url: admin_products_url, connection: { current_user: } } - } - let(:flash) { {} } - - before do - # Mock flash, because stimulus_reflex_testing doesn't support sessions - allow_any_instance_of(described_class).to receive(:flash).and_return(flash) - end - - describe '#delete_product' do - let(:product) { create(:simple_product) } - let(:action_name) { :delete_product } - - subject { build_reflex(method_name: action_name, **context) } - - before { subject.element.dataset.current_id = product.id } - - context 'given that the current user is admin' do - let(:current_user) { create(:admin_user) } - - it 'should successfully delete the product' do - subject.run(action_name) - product.reload - expect(product.deleted_at).not_to be_nil - expect(flash[:success]).to eq('Successfully deleted the product') - end - - it 'should be failed to delete the product' do - # mock db query failure - allow_any_instance_of(Spree::Product).to receive(:destroy).and_return(false) - subject.run(action_name) - product.reload - expect(product.deleted_at).to be_nil - expect(flash[:error]).to eq('Unable to delete the product') - end - end - - context 'given that the current user is not admin' do - let(:current_user) { create(:user) } - - it 'should raise the access denied exception' do - expect { subject.run(action_name) }.to raise_exception(CanCan::AccessDenied) - end - end - end - - describe '#delete_variant' do - let(:variant) { create(:variant) } - let(:action_name) { :delete_variant } - - subject { build_reflex(method_name: action_name, **context) } - - before { subject.element.dataset.current_id = variant.id } - - context 'given that the current user is admin' do - let(:current_user) { create(:admin_user) } - - it 'should successfully delete the variant' do - subject.run(action_name) - variant.reload - expect(variant.deleted_at).not_to be_nil - expect(flash[:success]).to eq('Successfully deleted the variant') - end - - it 'should be failed to delete the product' do - # mock db query failure - allow_any_instance_of(Spree::Variant).to receive(:destroy).and_return(false) - subject.run(action_name) - variant.reload - expect(variant.deleted_at).to be_nil - expect(flash[:error]).to eq('Unable to delete the variant') - end - end - - context 'given that the current user is not admin' do - let(:current_user) { create(:user) } - - it 'should raise the access denied exception' do - expect { subject.run(action_name) }.to raise_exception(CanCan::AccessDenied) - end - end - end -end - -# Build and run a reflex using the context -# Parameters can be added with params: option -# For more options see https://github.com/podia/stimulus_reflex_testing#usage -def run_reflex(method_name, opts = {}) - build_reflex(method_name:, **context.merge(opts)).tap{ |reflex| - reflex.run(method_name) - } -end diff --git a/spec/reflexes/user_reflex_spec.rb b/spec/reflexes/user_reflex_spec.rb index 815557208fd..36fba0c5992 100644 --- a/spec/reflexes/user_reflex_spec.rb +++ b/spec/reflexes/user_reflex_spec.rb @@ -2,7 +2,7 @@ require "reflex_helper" -describe UserReflex, type: :reflex do +RSpec.describe UserReflex, type: :reflex do let(:current_user) { create(:user) } let(:context) { { url: spree.admin_dashboard_url, connection: { current_user: } } } diff --git a/spec/requests/admin/images_spec.rb b/spec/requests/admin/images_spec.rb index 11d3659482d..a62f9bef81a 100644 --- a/spec/requests/admin/images_spec.rb +++ b/spec/requests/admin/images_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "/admin/products/:product_id/images", type: :request do +RSpec.describe "/admin/products/:product_id/images", type: :request do include AuthenticationHelper let!(:product) { create(:product) } @@ -11,7 +11,7 @@ login_as_admin end - shared_examples "updating images" do + shared_examples "updating images" do |expected_http_status_code| let(:params) do { image: { @@ -21,14 +21,16 @@ } end - it "creates a new image and redirects" do + it "creates a new image and redirects unless called by turbo" do expect { subject product.reload }.to change{ product.image&.attachment&.filename.to_s } - expect(response.status).to eq 302 - expect(response.location).to end_with spree.admin_product_images_path(product) + expect(response.status).to eq expected_http_status_code + if expected_http_status_code == 302 + expect(response.location).to end_with spree.admin_product_images_path(product) + end expect(product.image.url(:product)).to end_with "logo.png" end @@ -49,8 +51,6 @@ product.reload }.not_to change{ product.image&.attachment&.filename.to_s } - pending "error status code" - expect(response).to be_unprocessable expect(response.body).to include "Attachment has an invalid content type" end end @@ -59,13 +59,30 @@ describe "POST /admin/products/:product_id/images" do subject { post(spree.admin_product_images_path(product), params:) } - it_behaves_like "updating images" + it_behaves_like "updating images", 302 + end + + describe "POST /admin/products/:product_id/images with turbo" do + subject { post(spree.admin_product_images_path(product), params:, as: :turbo_stream) } + + it_behaves_like "updating images", 200 end describe "PATCH /admin/products/:product_id/images/:id" do let!(:product) { create(:product_with_image) } - subject { patch(spree.admin_product_image_path(product, product.image), params:) } + subject { + patch(spree.admin_product_image_path(product, product.image), params:) + } + + it_behaves_like "updating images", 302 + end + + describe "PATCH /admin/products/:product_id/images/:id with turbo" do + let!(:product) { create(:product_with_image) } + subject { + patch(spree.admin_product_image_path(product, product.image), params:, as: :turbo_stream) + } - it_behaves_like "updating images" + it_behaves_like "updating images", 200 end end diff --git a/spec/requests/admin/product_import_spec.rb b/spec/requests/admin/product_import_spec.rb index 3075457f400..b3c968748db 100644 --- a/spec/requests/admin/product_import_spec.rb +++ b/spec/requests/admin/product_import_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe "Product Import", type: :request do +RSpec.describe "Product Import", type: :request do include AuthenticationHelper describe "validate_data" do diff --git a/spec/requests/admin/vouchers_spec.rb b/spec/requests/admin/vouchers_spec.rb index fdb9213d3e9..64c16ef7ff8 100644 --- a/spec/requests/admin/vouchers_spec.rb +++ b/spec/requests/admin/vouchers_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "/admin/enterprises/:enterprise_id/vouchers", type: :request do +RSpec.describe "/admin/enterprises/:enterprise_id/vouchers", type: :request do let(:enterprise) { create(:supplier_enterprise, name: "Feedme") } let(:enterprise_user) { create(:user, enterprise_limit: 1) } diff --git a/spec/requests/api/orders_spec.rb b/spec/requests/api/orders_spec.rb index 20ea82c530e..433be2681b7 100644 --- a/spec/requests/api/orders_spec.rb +++ b/spec/requests/api/orders_spec.rb @@ -2,7 +2,7 @@ require 'swagger_helper' -describe 'api/v0/orders', swagger_doc: 'v0.yaml', type: :request do +RSpec.describe 'api/v0/orders', swagger_doc: 'v0.yaml', type: :request do path '/api/v0/orders' do get('list orders') do tags 'Orders' diff --git a/spec/requests/api/routes_spec.rb b/spec/requests/api/routes_spec.rb index fa7d1b20bc7..d3ab40d7924 100644 --- a/spec/requests/api/routes_spec.rb +++ b/spec/requests/api/routes_spec.rb @@ -3,7 +3,7 @@ # test a single endpoint to make sure the redirects are working as intended. require 'spec_helper' -describe 'Orders Cycles endpoint', type: :request do +RSpec.describe 'Orders Cycles endpoint', type: :request do let(:distributor) { create(:distributor_enterprise) } let(:order_cycle) { create(:order_cycle, distributors: [distributor]) } diff --git a/spec/requests/api/v1/customers_spec.rb b/spec/requests/api/v1/customers_spec.rb index 1ca08263fed..1259e99e03a 100644 --- a/spec/requests/api/v1/customers_spec.rb +++ b/spec/requests/api/v1/customers_spec.rb @@ -2,7 +2,7 @@ require "swagger_helper" -describe "Customers", type: :request, swagger_doc: "v1.yaml", feature: :api_v1 do +RSpec.describe "Customers", type: :request, swagger_doc: "v1.yaml", feature: :api_v1 do let!(:enterprise1) { create(:enterprise, name: "The Farm") } let!(:enterprise2) { create(:enterprise) } let!(:enterprise3) { create(:enterprise) } diff --git a/spec/requests/api_docs_spec.rb b/spec/requests/api_docs_spec.rb index 8b5ce15933f..f2d8fb5ab60 100644 --- a/spec/requests/api_docs_spec.rb +++ b/spec/requests/api_docs_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe "API documentation", type: :request do +RSpec.describe "API documentation", type: :request do it "shows the OFN API v1" do get rswag_ui_path expect(response).to redirect_to "/api-docs/index.html" diff --git a/spec/requests/checkout/failed_checkout_spec.rb b/spec/requests/checkout/failed_checkout_spec.rb deleted file mode 100644 index fdde8cb2976..00000000000 --- a/spec/requests/checkout/failed_checkout_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe "checking out an order that initially fails", type: :request do - include ShopWorkflow - - let!(:shop) { create(:enterprise) } - let!(:order_cycle) { create(:simple_order_cycle) } - let!(:exchange) { - create(:exchange, order_cycle:, sender: order_cycle.coordinator, receiver: shop, - incoming: false, pickup_time: "Monday") - } - let!(:address) { create(:address) } - let!(:line_item) { create(:line_item, order:, quantity: 3, price: 5.00) } - let!(:payment_method) { - create(:stripe_sca_payment_method, distributor_ids: [shop.id], environment: Rails.env) - } - let!(:check_payment_method) { - create(:payment_method, distributor_ids: [shop.id], environment: Rails.env) - } - let!(:shipping_method) { create(:shipping_method, distributor_ids: [shop.id]) } - let!(:shipment) { create(:shipment_with, :shipping_method, shipping_method:) } - let!(:order) { - create(:order, shipments: [shipment], distributor: shop, order_cycle:) - } - let(:params) do - { order: { - shipping_method_id: shipping_method.id, - payments_attributes: [{ payment_method_id: payment_method.id }], - bill_address_attributes: address.attributes.slice("firstname", "lastname", "address1", - "address2", "phone", "city", "zipcode", - "state_id", "country_id"), - ship_address_attributes: address.attributes.slice("firstname", "lastname", "address1", - "address2", "phone", "city", "zipcode", - "state_id", "country_id") - } } - end - - before do - order_cycle_distributed_variants = double(:order_cycle_distributed_variants) - allow(OrderCycles::DistributedVariantsService).to receive(:new) - .and_return(order_cycle_distributed_variants) - allow(order_cycle_distributed_variants) - .to receive(:distributes_order_variants?).and_return(true) - - order.reload.update_totals - set_order order - end - - pending "when shipping and payment fees apply" do - let(:calculator) { Calculator::FlatPercentItemTotal.new(preferred_flat_percent: 10) } - - before do - payment_method.calculator = calculator.dup - payment_method.save! - check_payment_method.calculator = calculator.dup - check_payment_method.save! - shipping_method.calculator = calculator.dup - shipping_method.save! - end - - it "clears shipments and payments before rendering the checkout" do - put update_checkout_path, params:, as: :json - - # Checking out a bogus Stripe Gateway without a source fails at :payment - # Shipments and payments should then be cleared before rendering checkout - expect(response.status).to be 400 - expect(flash[:error]) - .to eq 'Payment could not be processed, please check the details you entered' - order.reload - expect(order.shipments.count).to be 0 - expect(order.payments.count).to be 0 - expect(order.adjustment_total).to eq 0 - - # Add another line item to change the fee totals - create(:line_item, order:, quantity: 3, price: 5.00) - - # Use a check payment method, which should work - params[:order][:payments_attributes][0][:payment_method_id] = check_payment_method.id - - put update_checkout_path, params:, as: :json - - expect(response.status).to be 200 - order.reload - expect(order.total).to eq 36 - expect(order.adjustment_total).to eq 6 - expect(order.item_total).to eq 30 - expect(order.shipments.count).to eq 1 - expect(order.payments.count).to eq 1 - end - end -end diff --git a/spec/requests/checkout/paypal_spec.rb b/spec/requests/checkout/paypal_spec.rb index 5fd39d621a0..a32562835e4 100644 --- a/spec/requests/checkout/paypal_spec.rb +++ b/spec/requests/checkout/paypal_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe "checking out an order with a paypal express payment method", type: :request do +RSpec.describe "checking out an order with a paypal express payment method", type: :request do include ShopWorkflow include PaypalHelper diff --git a/spec/requests/checkout/routes_spec.rb b/spec/requests/checkout/routes_spec.rb index 0f1b518b8dd..55fe0546623 100644 --- a/spec/requests/checkout/routes_spec.rb +++ b/spec/requests/checkout/routes_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe 'checkout endpoints', type: :request do +RSpec.describe 'checkout endpoints', type: :request do include ShopWorkflow let!(:shop) { create(:enterprise) } diff --git a/spec/requests/checkout/stripe_sca_spec.rb b/spec/requests/checkout/stripe_sca_spec.rb index 8c5c48a3637..5640c491468 100644 --- a/spec/requests/checkout/stripe_sca_spec.rb +++ b/spec/requests/checkout/stripe_sca_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe "checking out an order with a Stripe SCA payment method", type: :request do +RSpec.describe "checking out an order with a Stripe SCA payment method", type: :request do include ShopWorkflow include AuthenticationHelper include OpenFoodNetwork::ApiHelper diff --git a/spec/requests/home_controller_spec.rb b/spec/requests/home_controller_spec.rb index 9400fedcd96..3453d309320 100644 --- a/spec/requests/home_controller_spec.rb +++ b/spec/requests/home_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe HomeController, type: :request do +RSpec.describe HomeController, type: :request do context "#unauthorized" do it "renders the unauthorized template" do get "/unauthorized" diff --git a/spec/requests/omniauth_callbacks_controller_spec.rb b/spec/requests/omniauth_callbacks_controller_spec.rb index 0bf3147ea2f..aef5ef69d64 100644 --- a/spec/requests/omniauth_callbacks_controller_spec.rb +++ b/spec/requests/omniauth_callbacks_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' # Devise calls OmniauthCallbacksController for OpenID Connect callbacks. -describe '/user/spree_user/auth/openid_connect/callback', type: :request do +RSpec.describe '/user/spree_user/auth/openid_connect/callback', type: :request do include AuthenticationHelper let(:user) { create(:user) } diff --git a/spec/requests/payments_controller_spec.rb b/spec/requests/payments_controller_spec.rb new file mode 100644 index 00000000000..9aab1272eb2 --- /dev/null +++ b/spec/requests/payments_controller_spec.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe "/payments/:id/authorize" do + let!(:user) { create(:user) } + let!(:order) { create(:order, user:) } + let!(:payment) { create(:payment, order:) } + + describe "when user isn't logged in" do + it "redirects to the login page and set error flash msg" do + get authorize_payment_path(payment) + expect(response).to redirect_to(root_path(anchor: "/login", after_login: request.fullpath)) + expect(flash[:error]).to eq I18n.t("spree.orders.edit.login_to_view_order") + end + end + + describe "when user is logged in" do + before { sign_in user } + + context "has cvv response message" do + before do + allow_any_instance_of(Spree::Payment).to receive(:cvv_response_message).and_return('http://example.com') + end + + it "redirects to the CVV response URL" do + get authorize_payment_path(payment) + expect(response).to redirect_to('http://example.com') + end + end + + context "doesn't have cvv response message" do + it "redirect to order URL" do + get authorize_payment_path(payment) + expect(response).to redirect_to(order_url(order)) + end + end + end +end diff --git a/spec/requests/spree/admin/overview_spec.rb b/spec/requests/spree/admin/overview_spec.rb index 4fc00f55637..4d5739f88ca 100644 --- a/spec/requests/spree/admin/overview_spec.rb +++ b/spec/requests/spree/admin/overview_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "/admin", type: :request do +RSpec.describe "/admin", type: :request do let(:enterprise) { create(:supplier_enterprise, name: "Feedme") } let(:enterprise_user) { create(:user, enterprise_limit: 1) } diff --git a/spec/requests/spree/admin/payments_spec.rb b/spec/requests/spree/admin/payments_spec.rb index c8ff3255547..18a2a4f75c6 100644 --- a/spec/requests/spree/admin/payments_spec.rb +++ b/spec/requests/spree/admin/payments_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Spree::Admin::PaymentsController, type: :request do +RSpec.describe Spree::Admin::PaymentsController, type: :request do let(:user) { order.user } let(:order) { create(:completed_order_with_fees) } diff --git a/spec/requests/voucher_adjustments_spec.rb b/spec/requests/voucher_adjustments_spec.rb index 56af4db4424..78ae9c29d51 100644 --- a/spec/requests/voucher_adjustments_spec.rb +++ b/spec/requests/voucher_adjustments_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe VoucherAdjustmentsController, type: :request do +RSpec.describe VoucherAdjustmentsController, type: :request do let(:user) { order.user } let(:address) { create(:address) } let(:distributor) { create(:distributor_enterprise, with_payment_and_shipping: true) } diff --git a/spec/routing/stripe_spec.rb b/spec/routing/stripe_spec.rb index b4f5c4b7d75..f9b04032330 100644 --- a/spec/routing/stripe_spec.rb +++ b/spec/routing/stripe_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "routing for Stripe return URLS", type: :routing do +RSpec.describe "routing for Stripe return URLS", type: :routing do context "checkout return URLs" do it "routes /checkout to checkout#edit" do expect(get: "checkout"). diff --git a/spec/serializers/api/admin/customer_serializer_spec.rb b/spec/serializers/api/admin/customer_serializer_spec.rb index ff241857af2..999c8015f15 100644 --- a/spec/serializers/api/admin/customer_serializer_spec.rb +++ b/spec/serializers/api/admin/customer_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::Admin::CustomerSerializer do +RSpec.describe Api::Admin::CustomerSerializer do let(:tag_list) { ["one", "two", "three"] } let(:customer) { create(:customer, tag_list:) } let!(:tag_rule) { diff --git a/spec/serializers/api/admin/customer_with_balance_serializer_spec.rb b/spec/serializers/api/admin/customer_with_balance_serializer_spec.rb index 5c0c3f1df5d..53e9c4490bb 100644 --- a/spec/serializers/api/admin/customer_with_balance_serializer_spec.rb +++ b/spec/serializers/api/admin/customer_with_balance_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::Admin::CustomerWithBalanceSerializer do +RSpec.describe Api::Admin::CustomerWithBalanceSerializer do let(:serialized_customer) { described_class.new(customer) } describe '#balance' do diff --git a/spec/serializers/api/admin/enterprise_serializer_spec.rb b/spec/serializers/api/admin/enterprise_serializer_spec.rb index 7c588bee1c0..3f20145771f 100644 --- a/spec/serializers/api/admin/enterprise_serializer_spec.rb +++ b/spec/serializers/api/admin/enterprise_serializer_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Api::Admin::EnterpriseSerializer do +RSpec.describe Api::Admin::EnterpriseSerializer do include FileHelper let(:enterprise) { create(:distributor_enterprise) } diff --git a/spec/serializers/api/admin/exchange_serializer_spec.rb b/spec/serializers/api/admin/exchange_serializer_spec.rb index 5f12b44cd53..05915d7823a 100644 --- a/spec/serializers/api/admin/exchange_serializer_spec.rb +++ b/spec/serializers/api/admin/exchange_serializer_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'open_food_network/order_cycle_permissions' -describe Api::Admin::ExchangeSerializer do +RSpec.describe Api::Admin::ExchangeSerializer do let(:v1) { create(:variant) } let(:v2) { create(:variant) } let(:v3) { create(:variant) } diff --git a/spec/serializers/api/admin/for_order_cycle/supplied_product_serializer_spec.rb b/spec/serializers/api/admin/for_order_cycle/supplied_product_serializer_spec.rb index f37eb83f09a..8cd6cd560d7 100644 --- a/spec/serializers/api/admin/for_order_cycle/supplied_product_serializer_spec.rb +++ b/spec/serializers/api/admin/for_order_cycle/supplied_product_serializer_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Api::Admin::ForOrderCycle::SuppliedProductSerializer do +RSpec.describe Api::Admin::ForOrderCycle::SuppliedProductSerializer do let(:coordinator) { create(:distributor_enterprise) } let(:order_cycle) { double(:order_cycle, coordinator:) } let!(:product) { create(:simple_product) } diff --git a/spec/serializers/api/admin/index_enterprise_serializer_spec.rb b/spec/serializers/api/admin/index_enterprise_serializer_spec.rb index e16a66a235b..810fbf951bf 100644 --- a/spec/serializers/api/admin/index_enterprise_serializer_spec.rb +++ b/spec/serializers/api/admin/index_enterprise_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::Admin::IndexEnterpriseSerializer do +RSpec.describe Api::Admin::IndexEnterpriseSerializer do let(:enterprise) { create(:distributor_enterprise) } context "when spree_current_user is a manager" do let(:user) { create(:user) } diff --git a/spec/serializers/api/admin/order_cycle_serializer_spec.rb b/spec/serializers/api/admin/order_cycle_serializer_spec.rb index e04e362dc17..b05bf9816ee 100644 --- a/spec/serializers/api/admin/order_cycle_serializer_spec.rb +++ b/spec/serializers/api/admin/order_cycle_serializer_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Api::Admin::OrderCycleSerializer do +RSpec.describe Api::Admin::OrderCycleSerializer do let(:order_cycle) { create(:order_cycle) } let(:serializer) { Api::Admin::OrderCycleSerializer.new order_cycle, diff --git a/spec/serializers/api/admin/order_serializer_spec.rb b/spec/serializers/api/admin/order_serializer_spec.rb index f1f16665c53..580a5ae2b1f 100644 --- a/spec/serializers/api/admin/order_serializer_spec.rb +++ b/spec/serializers/api/admin/order_serializer_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Api::Admin::OrderSerializer do +RSpec.describe Api::Admin::OrderSerializer do let(:serializer) { described_class.new order } let(:order) { build(:order) } diff --git a/spec/serializers/api/admin/product_serializer_spec.rb b/spec/serializers/api/admin/product_serializer_spec.rb index 7e42a781973..d2c0f25577b 100644 --- a/spec/serializers/api/admin/product_serializer_spec.rb +++ b/spec/serializers/api/admin/product_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::Admin::ProductSerializer do +RSpec.describe Api::Admin::ProductSerializer do let(:product) { create(:simple_product) } let(:serializer) { described_class.new(product) } diff --git a/spec/serializers/api/admin/subscription_customer_serializer_spec.rb b/spec/serializers/api/admin/subscription_customer_serializer_spec.rb index ef25c845c0e..fd1927c4efb 100644 --- a/spec/serializers/api/admin/subscription_customer_serializer_spec.rb +++ b/spec/serializers/api/admin/subscription_customer_serializer_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'open_food_network/address_finder' -describe Api::Admin::SubscriptionCustomerSerializer do +RSpec.describe Api::Admin::SubscriptionCustomerSerializer do let(:address) { build(:address) } let(:customer) { build(:customer) } let(:serializer) { Api::Admin::SubscriptionCustomerSerializer.new(customer) } diff --git a/spec/serializers/api/admin/subscription_line_item_serializer_spec.rb b/spec/serializers/api/admin/subscription_line_item_serializer_spec.rb index 9b1ca218183..79acfced05a 100644 --- a/spec/serializers/api/admin/subscription_line_item_serializer_spec.rb +++ b/spec/serializers/api/admin/subscription_line_item_serializer_spec.rb @@ -4,7 +4,7 @@ module Api module Admin - describe SubscriptionLineItemSerializer do + RSpec.describe SubscriptionLineItemSerializer do let(:subscription_line_item) { create(:subscription_line_item) } it "serializes a subscription line item with the product name" do diff --git a/spec/serializers/api/admin/variant_override_serializer_spec.rb b/spec/serializers/api/admin/variant_override_serializer_spec.rb index e282ea0175f..9cc1799ee1a 100644 --- a/spec/serializers/api/admin/variant_override_serializer_spec.rb +++ b/spec/serializers/api/admin/variant_override_serializer_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -describe Api::Admin::VariantOverrideSerializer do +RSpec.describe Api::Admin::VariantOverrideSerializer do let(:variant) { create(:variant) } let(:hub) { create(:distributor_enterprise) } let(:price) { 77.77 } diff --git a/spec/serializers/api/admin/variant_serializer_spec.rb b/spec/serializers/api/admin/variant_serializer_spec.rb index 957930bad8c..7c496d721d9 100644 --- a/spec/serializers/api/admin/variant_serializer_spec.rb +++ b/spec/serializers/api/admin/variant_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::Admin::VariantSerializer do +RSpec.describe Api::Admin::VariantSerializer do let(:variant) { create(:variant) } it "serializes the variant name" do diff --git a/spec/serializers/api/cached_enterprise_serializer_spec.rb b/spec/serializers/api/cached_enterprise_serializer_spec.rb index 9517b31a80a..584d365e736 100644 --- a/spec/serializers/api/cached_enterprise_serializer_spec.rb +++ b/spec/serializers/api/cached_enterprise_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::CachedEnterpriseSerializer do +RSpec.describe Api::CachedEnterpriseSerializer do let(:cached_enterprise_serializer) { described_class.new(enterprise) } let(:enterprise) { create(:enterprise) } diff --git a/spec/serializers/api/credit_card_serializer_spec.rb b/spec/serializers/api/credit_card_serializer_spec.rb index c8b2e3c3c11..f23160d9cf4 100644 --- a/spec/serializers/api/credit_card_serializer_spec.rb +++ b/spec/serializers/api/credit_card_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::CreditCardSerializer do +RSpec.describe Api::CreditCardSerializer do let(:card) { create(:credit_card) } let(:serializer) { Api::CreditCardSerializer.new card } diff --git a/spec/serializers/api/current_order_serializer_spec.rb b/spec/serializers/api/current_order_serializer_spec.rb index 6317477a0fb..255885c3307 100644 --- a/spec/serializers/api/current_order_serializer_spec.rb +++ b/spec/serializers/api/current_order_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::CurrentOrderSerializer do +RSpec.describe Api::CurrentOrderSerializer do let(:distributor) { build(:distributor_enterprise) } let(:order_cycle) { build(:simple_order_cycle) } let(:line_item) { build(:line_item, variant: create(:variant)) } diff --git a/spec/serializers/api/enterprise_serializer_spec.rb b/spec/serializers/api/enterprise_serializer_spec.rb index 970c8f63d32..0eb7d47abd1 100644 --- a/spec/serializers/api/enterprise_serializer_spec.rb +++ b/spec/serializers/api/enterprise_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::EnterpriseSerializer do +RSpec.describe Api::EnterpriseSerializer do let(:serializer) { Api::EnterpriseSerializer.new enterprise, data: } let(:enterprise) { create(:distributor_enterprise, is_primary_producer: true) } let(:taxon) { create(:taxon) } diff --git a/spec/serializers/api/enterprise_shopfront_list_serializer_spec.rb b/spec/serializers/api/enterprise_shopfront_list_serializer_spec.rb index 964c52e295f..47462ccbede 100644 --- a/spec/serializers/api/enterprise_shopfront_list_serializer_spec.rb +++ b/spec/serializers/api/enterprise_shopfront_list_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::EnterpriseShopfrontListSerializer do +RSpec.describe Api::EnterpriseShopfrontListSerializer do let(:enterprise) { create(:distributor_enterprise) } let(:serializer) { Api::EnterpriseShopfrontListSerializer.new enterprise diff --git a/spec/serializers/api/enterprise_shopfront_serializer_spec.rb b/spec/serializers/api/enterprise_shopfront_serializer_spec.rb index 8d857194839..766995c7934 100644 --- a/spec/serializers/api/enterprise_shopfront_serializer_spec.rb +++ b/spec/serializers/api/enterprise_shopfront_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::EnterpriseShopfrontSerializer do +RSpec.describe Api::EnterpriseShopfrontSerializer do let!(:hub) { create(:distributor_enterprise, with_payment_and_shipping: true) } let!(:producer) { create(:supplier_enterprise) } let!(:producer_hidden) { create(:supplier_enterprise_hidden) } diff --git a/spec/serializers/api/group_list_serializer_spec.rb b/spec/serializers/api/group_list_serializer_spec.rb index 69f10a6360b..5dff7def23e 100644 --- a/spec/serializers/api/group_list_serializer_spec.rb +++ b/spec/serializers/api/group_list_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::GroupListSerializer do +RSpec.describe Api::GroupListSerializer do let!(:group) { create(:enterprise_group) } let!(:producer) { create(:supplier_enterprise) } diff --git a/spec/serializers/api/order_cycle_serializer_spec.rb b/spec/serializers/api/order_cycle_serializer_spec.rb index 5b0a199d111..af316624d70 100644 --- a/spec/serializers/api/order_cycle_serializer_spec.rb +++ b/spec/serializers/api/order_cycle_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::OrderCycleSerializer do +RSpec.describe Api::OrderCycleSerializer do let(:order_cycle) { create(:simple_order_cycle) } let(:serializer) { Api::OrderCycleSerializer.new(order_cycle).to_json } diff --git a/spec/serializers/api/order_serializer_spec.rb b/spec/serializers/api/order_serializer_spec.rb index 521c3fa4f72..dde01265141 100644 --- a/spec/serializers/api/order_serializer_spec.rb +++ b/spec/serializers/api/order_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::OrderSerializer do +RSpec.describe Api::OrderSerializer do let(:serializer) { Api::OrderSerializer.new order } let(:order) { create(:completed_order_with_totals) } diff --git a/spec/serializers/api/product_serializer_spec.rb b/spec/serializers/api/product_serializer_spec.rb index d44e9646657..af0b1f3bf4e 100644 --- a/spec/serializers/api/product_serializer_spec.rb +++ b/spec/serializers/api/product_serializer_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require 'open_food_network/enterprise_fee_calculator' -describe Api::ProductSerializer do +RSpec.describe Api::ProductSerializer do include ShopWorkflow let!(:distributor) { create(:distributor_enterprise) } diff --git a/spec/serializers/api/shipping_method_serializer_spec.rb b/spec/serializers/api/shipping_method_serializer_spec.rb index e112f97310d..a24665052eb 100644 --- a/spec/serializers/api/shipping_method_serializer_spec.rb +++ b/spec/serializers/api/shipping_method_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::ShippingMethodSerializer do +RSpec.describe Api::ShippingMethodSerializer do let(:shipping_method) { create(:shipping_method) } it "serializes a test shipping_method" do diff --git a/spec/serializers/api/variant_serializer_spec.rb b/spec/serializers/api/variant_serializer_spec.rb index e4d2cfae3d4..b8e50edad75 100644 --- a/spec/serializers/api/variant_serializer_spec.rb +++ b/spec/serializers/api/variant_serializer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Api::VariantSerializer do +RSpec.describe Api::VariantSerializer do subject { Api::VariantSerializer.new variant } let(:variant) { create(:variant) } diff --git a/spec/services/address_geocoder_spec.rb b/spec/services/address_geocoder_spec.rb index 1215c95e1be..58652755215 100644 --- a/spec/services/address_geocoder_spec.rb +++ b/spec/services/address_geocoder_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe AddressGeocoder do +RSpec.describe AddressGeocoder do let(:australia) { Spree::Country.find_or_create_by!(name: "Australia") } let(:victoria) { Spree::State.find_or_create_by(name: "Victoria", country: australia) } let(:address) do diff --git a/spec/services/cache_service_spec.rb b/spec/services/cache_service_spec.rb index c82a1aeaf2b..526f211bfd5 100644 --- a/spec/services/cache_service_spec.rb +++ b/spec/services/cache_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe CacheService do +RSpec.describe CacheService do let(:rails_cache) { Rails.cache } describe "#cache" do diff --git a/spec/services/cap_quantity_spec.rb b/spec/services/cap_quantity_spec.rb index 754a10f1c15..3f97f117dcc 100644 --- a/spec/services/cap_quantity_spec.rb +++ b/spec/services/cap_quantity_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe CapQuantity do +RSpec.describe CapQuantity do describe "checking that line items are available to purchase" do let(:order_cycle) { create(:simple_order_cycle) } let(:shop) { order_cycle.coordinator } diff --git a/spec/services/cart_service_spec.rb b/spec/services/cart_service_spec.rb index ea5b1dc731d..13b70a2bd71 100644 --- a/spec/services/cart_service_spec.rb +++ b/spec/services/cart_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe CartService do +RSpec.describe CartService do let(:order) { double(:order, id: 123) } let(:currency) { "EUR" } let(:params) { {} } diff --git a/spec/services/checkout/payment_method_fetcher_spec.rb b/spec/services/checkout/payment_method_fetcher_spec.rb index 9f0c23aa89d..b3f941b0e46 100644 --- a/spec/services/checkout/payment_method_fetcher_spec.rb +++ b/spec/services/checkout/payment_method_fetcher_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Checkout::PaymentMethodFetcher do +RSpec.describe Checkout::PaymentMethodFetcher do let!(:order) { create(:completed_order_with_totals) } let(:payment1) { build(:payment, order:) } let(:payment2) { build(:payment, order:) } diff --git a/spec/services/checkout/post_checkout_actions_spec.rb b/spec/services/checkout/post_checkout_actions_spec.rb index 765b84e541a..30b4936eaaa 100644 --- a/spec/services/checkout/post_checkout_actions_spec.rb +++ b/spec/services/checkout/post_checkout_actions_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Checkout::PostCheckoutActions do +RSpec.describe Checkout::PostCheckoutActions do let(:order) { create(:order_with_distributor) } let(:postCheckoutActions) { Checkout::PostCheckoutActions.new(order) } diff --git a/spec/services/checkout/stripe_redirect_spec.rb b/spec/services/checkout/stripe_redirect_spec.rb index a2d547e8861..97989589949 100644 --- a/spec/services/checkout/stripe_redirect_spec.rb +++ b/spec/services/checkout/stripe_redirect_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Checkout::StripeRedirect do +RSpec.describe Checkout::StripeRedirect do describe '#path' do let(:order) { create(:order) } let(:service) { Checkout::StripeRedirect.new(payment_method, order) } diff --git a/spec/services/content_sanitizer_spec.rb b/spec/services/content_sanitizer_spec.rb index 1773c5c9fb7..63b6a154784 100644 --- a/spec/services/content_sanitizer_spec.rb +++ b/spec/services/content_sanitizer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ContentSanitizer do +RSpec.describe ContentSanitizer do let(:service) { described_class.new } context "#strip_content" do diff --git a/spec/services/default_shipping_category_spec.rb b/spec/services/default_shipping_category_spec.rb index c2032715dff..12d84881811 100644 --- a/spec/services/default_shipping_category_spec.rb +++ b/spec/services/default_shipping_category_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe DefaultShippingCategory do +RSpec.describe DefaultShippingCategory do describe '.create!' do it "names the location 'Default'" do shipping_category = described_class.create! diff --git a/spec/services/default_stock_location_spec.rb b/spec/services/default_stock_location_spec.rb index d73ef912cf2..93b0a053f72 100644 --- a/spec/services/default_stock_location_spec.rb +++ b/spec/services/default_stock_location_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe DefaultStockLocation do +RSpec.describe DefaultStockLocation do describe '.find_or_create' do context 'when a location named default already exists' do let!(:location) do diff --git a/spec/services/embedded_page_service_spec.rb b/spec/services/embedded_page_service_spec.rb index 54102f43214..4ae9f91ba44 100644 --- a/spec/services/embedded_page_service_spec.rb +++ b/spec/services/embedded_page_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe EmbeddedPageService do +RSpec.describe EmbeddedPageService do let(:enterprise_slug) { 'test-enterprise' } let(:params) { { controller: 'enterprises', action: 'shop', id: enterprise_slug, embedded_shopfront: true } @@ -39,7 +39,7 @@ expect(session[:embedded_shopfront]).to eq true expect(session[:embedding_domain]).to eq 'embedding-enterprise.com' expect(session[:shopfront_redirect]) - .to eq '/' + enterprise_slug + '/shop?embedded_shopfront=true' + .to eq "/#{enterprise_slug}/shop?embedded_shopfront=true" end it "publicly reports that embedded layout should be used" do @@ -58,7 +58,7 @@ expect(session[:embedded_shopfront]).to eq true expect(session[:embedding_domain]).to eq 'embedding-enterprise.com' expect(session[:shopfront_redirect]) - .to eq '/' + enterprise_slug + '/shop?embedded_shopfront=true' + .to eq "/#{enterprise_slug}/shop?embedded_shopfront=true" end end diff --git a/spec/services/exchange_products_renderer_spec.rb b/spec/services/exchange_products_renderer_spec.rb index 2c7863c0133..df0e482edc1 100644 --- a/spec/services/exchange_products_renderer_spec.rb +++ b/spec/services/exchange_products_renderer_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe ExchangeProductsRenderer do +RSpec.describe ExchangeProductsRenderer do let(:order_cycle) { create(:order_cycle) } let(:coordinator) { order_cycle.coordinator } let(:renderer) { described_class.new(order_cycle, coordinator.owner) } diff --git a/spec/services/exchange_variant_bulk_updater_spec.rb b/spec/services/exchange_variant_bulk_updater_spec.rb index ebe6a408fe9..880f097548e 100644 --- a/spec/services/exchange_variant_bulk_updater_spec.rb +++ b/spec/services/exchange_variant_bulk_updater_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ExchangeVariantBulkUpdater do +RSpec.describe ExchangeVariantBulkUpdater do let!(:first_variant) { create(:variant) } let!(:second_variant) { create(:variant) } let!(:third_variant) { create(:variant) } diff --git a/spec/services/file_path_sanitizer_spec.rb b/spec/services/file_path_sanitizer_spec.rb index 4a47c2c1b2a..9dd4fc15816 100644 --- a/spec/services/file_path_sanitizer_spec.rb +++ b/spec/services/file_path_sanitizer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe FilePathSanitizer do +RSpec.describe FilePathSanitizer do let(:folder_path){ '/tmp/product_import123' } let(:file_path) { "#{folder_path}/import.csv" } diff --git a/spec/services/html_sanitizer_spec.rb b/spec/services/html_sanitizer_spec.rb new file mode 100644 index 00000000000..bda9eb2188b --- /dev/null +++ b/spec/services/html_sanitizer_spec.rb @@ -0,0 +1,101 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe HtmlSanitizer do + subject { described_class } + + context "when HTML has supported tags" do + it "keeps supported regular tags" do + supported_tags = %w[h1 h2 h3 h4 div p b i u a strong em del pre blockquote ul ol li figure] + supported_tags.each do |tag| + html = "<#{tag}>Content" + sanitized_html = subject.sanitize(html) + expect(sanitized_html).to eq(html), "Expected '#{tag}' to be preserved." + end + end + + it "keeps supported void tags" do + supported_tags = %w[br hr] + supported_tags.each do |tag| + html = "<#{tag}>" + sanitized_html = subject.sanitize(html) + expect(sanitized_html).to eq(html), "Expected '#{tag}' to be preserved." + end + end + + it "handles nested tags" do + html = '
  • Item 1
  • Item 2
' + expect(subject.sanitize(html)).to eq(html) + end + end + + context "when HTML has dangerous tags" do + it "removes script tags" do + html = "Hello !" + expect(subject.sanitize(html)).to eq "Hello alert!" + end + + it "removes iframe tags" do + html = "Content " + expect(subject.sanitize(html)).to eq "Content " + end + + it "removes object tags" do + html = "" + expect(subject.sanitize(html)).to eq "" + end + + it "removes embed tags" do + html = "" + expect(subject.sanitize(html)).to eq "" + end + + it "removes link tags" do + html = "" + expect(subject.sanitize(html)).to eq "" + end + + it "removes base tags" do + html = "" + expect(subject.sanitize(html)).to eq "" + end + + it "removes form tags" do + html = "
...
" + expect(subject.sanitize(html)).to eq "..." + end + + it "removes combined dangerous tags" do + html = "" + expect(subject.sanitize(html)).to eq "alert" + end + end + + context "when HTML has supported attributes" do + it "keeps supported attributes" do + html = 'Hello alert!' + expect(subject.sanitize(html)) + .to eq 'Hello alert!' + end + end + + context "when HTML has dangerous attributes" do + it "removes unsupported attributes" do + html = 'Hello alert!' + expect(subject.sanitize(html)) + .to eq 'Hello alert!' + end + + it "removes dangerous attribute values" do + html = 'Hello you!' + expect(subject.sanitize(html)) + .to eq 'Hello you!' + end + + it "keeps only Trix-specific data attributes" do + html = '
...
' + expect(subject.sanitize(html)).to eq('
...
') + end + end +end diff --git a/spec/services/image_importer_spec.rb b/spec/services/image_importer_spec.rb index b00796b25a0..df526750ca9 100644 --- a/spec/services/image_importer_spec.rb +++ b/spec/services/image_importer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ImageImporter do +RSpec.describe ImageImporter do let(:url) { Rails.root.join("spec/fixtures/files/logo.png").to_s } let(:product) { create(:product) } diff --git a/spec/services/invoice_data_generator_spec.rb b/spec/services/invoice_data_generator_spec.rb index 1099482a9ff..917b3557a8d 100644 --- a/spec/services/invoice_data_generator_spec.rb +++ b/spec/services/invoice_data_generator_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe InvoiceDataGenerator do +RSpec.describe InvoiceDataGenerator do describe '#generate' do let!(:order) { create(:completed_order_with_fees) } let!(:invoice_data_generator){ InvoiceDataGenerator.new(order) } diff --git a/spec/services/invoice_renderer_spec.rb b/spec/services/invoice_renderer_spec.rb index cbad391a0f3..e732aa3b5de 100644 --- a/spec/services/invoice_renderer_spec.rb +++ b/spec/services/invoice_renderer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe InvoiceRenderer do +RSpec.describe InvoiceRenderer do include Spree::PaymentMethodsHelper let(:service) { described_class.new } diff --git a/spec/services/mail_configuration_spec.rb b/spec/services/mail_configuration_spec.rb index f0f10a9c4b1..c4b6b7068d2 100644 --- a/spec/services/mail_configuration_spec.rb +++ b/spec/services/mail_configuration_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe MailConfiguration do +RSpec.describe MailConfiguration do describe 'apply!' do before do allow(Spree::Core::MailSettings).to receive(:init) { true } diff --git a/spec/services/order_cycles/clone_service_spec.rb b/spec/services/order_cycles/clone_service_spec.rb index 32525a5b73f..a3b8b4d16f8 100644 --- a/spec/services/order_cycles/clone_service_spec.rb +++ b/spec/services/order_cycles/clone_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderCycles::CloneService do +RSpec.describe OrderCycles::CloneService do describe "#create" do it "clones the order cycle" do coordinator = create(:enterprise); diff --git a/spec/services/order_cycles/distributed_products_service_spec.rb b/spec/services/order_cycles/distributed_products_service_spec.rb index 76a41be2d7e..4427c484944 100644 --- a/spec/services/order_cycles/distributed_products_service_spec.rb +++ b/spec/services/order_cycles/distributed_products_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderCycles::DistributedProductsService do +RSpec.describe OrderCycles::DistributedProductsService do describe "#products_relation" do let(:distributor) { create(:distributor_enterprise) } let(:product) { create(:product) } diff --git a/spec/services/order_cycles/distributed_variants_service_spec.rb b/spec/services/order_cycles/distributed_variants_service_spec.rb index 6c5bde8aa1a..d0abcf08f73 100644 --- a/spec/services/order_cycles/distributed_variants_service_spec.rb +++ b/spec/services/order_cycles/distributed_variants_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderCycles::DistributedVariantsService do +RSpec.describe OrderCycles::DistributedVariantsService do let(:order) { double(:order) } let(:distributor) { double(:distributor) } let(:order_cycle) { double(:order_cycle) } diff --git a/spec/services/order_cycles/form_service_spec.rb b/spec/services/order_cycles/form_service_spec.rb index 3f39ad5439a..ca8c5e1b18a 100644 --- a/spec/services/order_cycles/form_service_spec.rb +++ b/spec/services/order_cycles/form_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderCycles::FormService do +RSpec.describe OrderCycles::FormService do describe "save" do describe "creating a new order cycle from params" do let(:shop) { create(:enterprise) } diff --git a/spec/services/order_cycles/warning_service_spec.rb b/spec/services/order_cycles/warning_service_spec.rb index 1cb7e0bb9f0..aad80e87212 100644 --- a/spec/services/order_cycles/warning_service_spec.rb +++ b/spec/services/order_cycles/warning_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderCycles::WarningService do +RSpec.describe OrderCycles::WarningService do let(:user) { create(:user) } let(:subject) { OrderCycles::WarningService } let!(:distributor) { create(:enterprise, owner: user) } diff --git a/spec/services/order_cycles/webhook_service_spec.rb b/spec/services/order_cycles/webhook_service_spec.rb index 060607b8f90..bdc77bb151f 100644 --- a/spec/services/order_cycles/webhook_service_spec.rb +++ b/spec/services/order_cycles/webhook_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe OrderCycles::WebhookService do +RSpec.describe OrderCycles::WebhookService do let(:order_cycle) { create( :simple_order_cycle, diff --git a/spec/services/orders/available_payment_methods_service_spec.rb b/spec/services/orders/available_payment_methods_service_spec.rb index b31d3af5f65..fc442f37481 100644 --- a/spec/services/orders/available_payment_methods_service_spec.rb +++ b/spec/services/orders/available_payment_methods_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Orders::AvailablePaymentMethodsService do +RSpec.describe Orders::AvailablePaymentMethodsService do context "when the order has no current_distributor" do it "returns an empty array" do order_cycle = create(:sells_own_order_cycle) diff --git a/spec/services/orders/available_shipping_methods_service_spec.rb b/spec/services/orders/available_shipping_methods_service_spec.rb index 9ee26ca8047..639ff8d0df3 100644 --- a/spec/services/orders/available_shipping_methods_service_spec.rb +++ b/spec/services/orders/available_shipping_methods_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Orders::AvailableShippingMethodsService do +RSpec.describe Orders::AvailableShippingMethodsService do context "when the order has no current_distributor" do it "returns an empty array" do order_cycle = create(:sells_own_order_cycle) diff --git a/spec/services/orders/cart_reset_service_spec.rb b/spec/services/orders/cart_reset_service_spec.rb index 05e2ea43877..3c4b01048d1 100644 --- a/spec/services/orders/cart_reset_service_spec.rb +++ b/spec/services/orders/cart_reset_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Orders::CartResetService do +RSpec.describe Orders::CartResetService do let(:distributor) { create(:distributor_enterprise) } let(:order) { create(:order, :with_line_item, distributor:) } diff --git a/spec/services/orders/checkout_restart_service_spec.rb b/spec/services/orders/checkout_restart_service_spec.rb index 414838e31b8..3ebc3284b4a 100644 --- a/spec/services/orders/checkout_restart_service_spec.rb +++ b/spec/services/orders/checkout_restart_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Orders::CheckoutRestartService do +RSpec.describe Orders::CheckoutRestartService do let(:order) { create(:order_with_distributor) } describe "#call" do diff --git a/spec/services/orders/compare_invoice_service_spec.rb b/spec/services/orders/compare_invoice_service_spec.rb index 932e5b54b67..19ad37422a3 100644 --- a/spec/services/orders/compare_invoice_service_spec.rb +++ b/spec/services/orders/compare_invoice_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -shared_examples "attribute changes - payment total" do |boolean, type| +RSpec.shared_examples "attribute changes - payment total" do |boolean, type| before do Spree::Order.where(id: order.id).update_all(payment_total: order.payment_total + 10) end @@ -13,7 +13,7 @@ end end -shared_examples "attribute changes - order total" do |boolean, type| +RSpec.shared_examples "attribute changes - order total" do |boolean, type| before do Spree::Order.where(id: order.id).update_all(total: order.total + 10) end @@ -24,7 +24,7 @@ end end -shared_examples "attribute changes - order state: cancelled" do |boolean, type| +RSpec.shared_examples "attribute changes - order state: cancelled" do |boolean, type| before do order.cancel! end @@ -35,7 +35,7 @@ end end -shared_examples "attribute changes - tax total changes" do |boolean, type, included_boolean| +RSpec.shared_examples "attribute changes - tax total changes" do |boolean, type, included_boolean| let(:order) do create(:order_with_taxes, product_price: 110, tax_rate_amount: 0.1, included_in_price: included_boolean) @@ -58,7 +58,7 @@ end end -shared_examples "attribute changes - shipping method" do |boolean, type| +RSpec.shared_examples "attribute changes - shipping method" do |boolean, type| let(:shipping_method) { create(:shipping_method) } before do @@ -71,13 +71,13 @@ end end -shared_examples "no attribute changes" do +RSpec.shared_examples "no attribute changes" do it "returns false if no attribute has changed" do expect(subject).to be false end end -shared_examples "attribute changes - special insctructions" do |boolean, type| +RSpec.shared_examples "attribute changes - special insctructions" do |boolean, type| before do order.update!(special_instructions: "A very special insctruction.") end @@ -86,7 +86,7 @@ end end -shared_examples "attribute changes - note" do |boolean, type| +RSpec.shared_examples "attribute changes - note" do |boolean, type| before do order.update!(note: "THIS IS A NEW NOTE") end @@ -95,7 +95,8 @@ end end -shared_examples "associated attribute changes - adjustments (create/delete)" do |boolean, type| +RSpec.shared_examples "associated attribute changes - adjustments (create/delete)" do + |boolean, type| context "creating an adjustment" do before { order.adjustments << create(:adjustment, order:) } it "returns #{boolean} if a #{type} attribute changes" do @@ -111,7 +112,7 @@ end end -shared_examples "associated attribute changes - adjustments (edit amount)" do |boolean, type| +RSpec.shared_examples "associated attribute changes - adjustments (edit amount)" do |boolean, type| context "with an existing adjustments" do context "editing the amount" do before { order.all_adjustments.first.update!(amount: 123) } @@ -122,7 +123,7 @@ end end -shared_examples "associated attribute changes - adjustments (edit label)" do |boolean, type| +RSpec.shared_examples "associated attribute changes - adjustments (edit label)" do |boolean, type| context "adjustment changes" do context "editing the label" do before { order.all_adjustments.first.update!(label: "It's a new label") } @@ -133,7 +134,7 @@ end end -shared_examples "associated attribute changes - line items" do |boolean, type| +RSpec.shared_examples "associated attribute changes - line items" do |boolean, type| context "line item changes" do let(:line_item){ order.line_items.first } context "on quantitity" do @@ -154,7 +155,7 @@ end end -shared_examples "associated attribute changes - bill address" do |boolean, type| +RSpec.shared_examples "associated attribute changes - bill address" do |boolean, type| context "bill address - a #{type}" do let(:bill_address) { Spree::Address.where(id: order.bill_address_id) } it "first name" do @@ -207,7 +208,7 @@ end end -shared_examples "associated attribute changes - ship address" do |boolean, type| +RSpec.shared_examples "associated attribute changes - ship address" do |boolean, type| context "ship address - a #{type}" do let(:ship_address) { Spree::Address.where(id: order.ship_address_id) } it "first name" do @@ -260,7 +261,7 @@ end end -shared_examples "associated attribute changes - payments" do |boolean, type| +RSpec.shared_examples "associated attribute changes - payments" do |boolean, type| context "payment changes on" do let(:payment) { create(:payment, order_id: order.id) } context "amount" do @@ -284,7 +285,7 @@ end end -shared_examples "attribute changes - payment state" do |boolean, type| +RSpec.shared_examples "attribute changes - payment state" do |boolean, type| let(:payment) { order.payments.first } context "payment changes on" do context "state" do @@ -299,7 +300,7 @@ end end -describe Orders::CompareInvoiceService do +RSpec.describe Orders::CompareInvoiceService do let!(:invoice){ create(:invoice, order:, diff --git a/spec/services/orders/customer_cancellation_service_spec.rb b/spec/services/orders/customer_cancellation_service_spec.rb index 624ea08fd32..a7b3e7aad8d 100644 --- a/spec/services/orders/customer_cancellation_service_spec.rb +++ b/spec/services/orders/customer_cancellation_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Orders::CustomerCancellationService do +RSpec.describe Orders::CustomerCancellationService do let(:mail_mock) { double(:mailer_mock, deliver_later: true) } before do allow(Spree::OrderMailer).to receive(:cancel_email_for_shop) { mail_mock } diff --git a/spec/services/orders/factory_service_spec.rb b/spec/services/orders/factory_service_spec.rb index 26c8ec25647..aee3bea3cbe 100644 --- a/spec/services/orders/factory_service_spec.rb +++ b/spec/services/orders/factory_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Orders::FactoryService do +RSpec.describe Orders::FactoryService do let(:variant1) { create(:variant, price: 5.0) } let(:variant2) { create(:variant, price: 7.0) } let(:user) { create(:user) } diff --git a/spec/services/orders/find_payment_service_spec.rb b/spec/services/orders/find_payment_service_spec.rb index 0777d5ed2cd..1e898f7e53a 100644 --- a/spec/services/orders/find_payment_service_spec.rb +++ b/spec/services/orders/find_payment_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Orders::FindPaymentService do +RSpec.describe Orders::FindPaymentService do let(:order) { create(:order_with_distributor) } let(:finder) { Orders::FindPaymentService.new(order) } diff --git a/spec/services/orders/generate_invoice_service_spec.rb b/spec/services/orders/generate_invoice_service_spec.rb index 50fb5350d5f..a396a268976 100644 --- a/spec/services/orders/generate_invoice_service_spec.rb +++ b/spec/services/orders/generate_invoice_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Orders::GenerateInvoiceService do +RSpec.describe Orders::GenerateInvoiceService do let!(:order) { create(:completed_order_with_fees) } let!(:invoice_data_generator){ InvoiceDataGenerator.new(order) } let!(:latest_invoice){ diff --git a/spec/services/orders/handle_fees_service_spec.rb b/spec/services/orders/handle_fees_service_spec.rb index 6b926833311..f31ce21ce2b 100644 --- a/spec/services/orders/handle_fees_service_spec.rb +++ b/spec/services/orders/handle_fees_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Orders::HandleFeesService do +RSpec.describe Orders::HandleFeesService do let(:order_cycle) { create(:order_cycle) } let(:order) { create(:order_with_line_items, line_items_count: 1, order_cycle:) } let(:line_item) { order.line_items.first } diff --git a/spec/services/orders/mask_data_service_spec.rb b/spec/services/orders/mask_data_service_spec.rb index f23141922c6..aed4ba48a80 100644 --- a/spec/services/orders/mask_data_service_spec.rb +++ b/spec/services/orders/mask_data_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Orders::MaskDataService do +RSpec.describe Orders::MaskDataService do describe '#call' do let(:distributor) { create(:enterprise) } let(:order) { create(:order, distributor:, ship_address: create(:address)) } diff --git a/spec/services/orders/order_tax_adjustments_fetcher_spec.rb b/spec/services/orders/order_tax_adjustments_fetcher_spec.rb index f45280c27a9..af19dd22f8b 100644 --- a/spec/services/orders/order_tax_adjustments_fetcher_spec.rb +++ b/spec/services/orders/order_tax_adjustments_fetcher_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Orders::FetchTaxAdjustmentsService do +RSpec.describe Orders::FetchTaxAdjustmentsService do describe "#totals" do let(:zone) { create(:zone_with_member) } let(:coordinator) { create(:distributor_enterprise, charges_sales_tax: true) } diff --git a/spec/services/orders/sync_service_spec.rb b/spec/services/orders/sync_service_spec.rb index f45a009a9cb..9dd6eb968dd 100644 --- a/spec/services/orders/sync_service_spec.rb +++ b/spec/services/orders/sync_service_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Orders::SyncService do +RSpec.describe Orders::SyncService do describe "updating the shipping method" do let!(:subscription) { create(:subscription, with_items: true, with_proxy_orders: true) } let!(:order) { subscription.proxy_orders.first.initialise_order! } diff --git a/spec/services/orders/workflow_service_spec.rb b/spec/services/orders/workflow_service_spec.rb index 08e48fa0cd6..d1db9ff3c3a 100644 --- a/spec/services/orders/workflow_service_spec.rb +++ b/spec/services/orders/workflow_service_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Orders::WorkflowService do +RSpec.describe Orders::WorkflowService do let!(:distributor) { create(:distributor_enterprise) } let!(:order) do create(:order_with_totals_and_distribution, distributor:, diff --git a/spec/services/path_checker_spec.rb b/spec/services/path_checker_spec.rb index e0a4160e187..2ce16c19b5a 100644 --- a/spec/services/path_checker_spec.rb +++ b/spec/services/path_checker_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe PathChecker do +RSpec.describe PathChecker do describe "#active_path?" do let(:view_context) { double("view context") } diff --git a/spec/services/paypal_items_builder_spec.rb b/spec/services/paypal_items_builder_spec.rb index 227422b6126..f34be2f6acc 100644 --- a/spec/services/paypal_items_builder_spec.rb +++ b/spec/services/paypal_items_builder_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe PaypalItemsBuilder do +RSpec.describe PaypalItemsBuilder do let(:order) { create(:completed_order_with_fees) } let(:service) { described_class.new(order) } let(:items) { described_class.new(order).call } diff --git a/spec/services/permissions/order_spec.rb b/spec/services/permissions/order_spec.rb index 2e3ba313ee2..385b4a336ac 100644 --- a/spec/services/permissions/order_spec.rb +++ b/spec/services/permissions/order_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module Permissions - describe Order do + RSpec.describe Order do let(:user) { double(:user) } let(:permissions) { Permissions::Order.new(user) } let!(:basic_permissions) { OpenFoodNetwork::Permissions.new(user) } diff --git a/spec/services/permitted_attributes/order_cycle_spec.rb b/spec/services/permitted_attributes/order_cycle_spec.rb index 6990548af14..1036e426b29 100644 --- a/spec/services/permitted_attributes/order_cycle_spec.rb +++ b/spec/services/permitted_attributes/order_cycle_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module PermittedAttributes - describe OrderCycle do + RSpec.describe OrderCycle do let(:oc_permitted_attributes) { PermittedAttributes::OrderCycle.new(params) } describe "with basic attributes" do diff --git a/spec/services/permitted_attributes/user_spec.rb b/spec/services/permitted_attributes/user_spec.rb index 8b98311efa4..e5119d696e1 100644 --- a/spec/services/permitted_attributes/user_spec.rb +++ b/spec/services/permitted_attributes/user_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module PermittedAttributes - describe User do + RSpec.describe User do describe "simple usage" do let(:user_permitted_attributes) { PermittedAttributes::User.new(params) } diff --git a/spec/services/place_proxy_order_spec.rb b/spec/services/place_proxy_order_spec.rb index 2fc895ec535..4fd895d8d9a 100644 --- a/spec/services/place_proxy_order_spec.rb +++ b/spec/services/place_proxy_order_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe PlaceProxyOrder do +RSpec.describe PlaceProxyOrder do include ActiveSupport::Testing::TimeHelpers subject { described_class.new(proxy_order, summarizer, logger, stock_changes_loader) } diff --git a/spec/services/process_payment_intent_spec.rb b/spec/services/process_payment_intent_spec.rb index 51ab52294ff..10af03a91e8 100644 --- a/spec/services/process_payment_intent_spec.rb +++ b/spec/services/process_payment_intent_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ProcessPaymentIntent do +RSpec.describe ProcessPaymentIntent do let(:service) { described_class.new } describe "processing a payment intent" do diff --git a/spec/services/product_filters_spec.rb b/spec/services/product_filters_spec.rb index 056e3c16810..dce7571c1e8 100644 --- a/spec/services/product_filters_spec.rb +++ b/spec/services/product_filters_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ProductFilters do +RSpec.describe ProductFilters do describe "extract" do it "should return a hash including only key from ProductFilters::PRODUCT_FILTERS" do params = { 'id' => 20, 'producerFilter' => 2, 'categoryFilter' => 5 } diff --git a/spec/services/product_tag_rules_filterer_spec.rb b/spec/services/product_tag_rules_filterer_spec.rb index 1302788381a..eafd6d6d38d 100644 --- a/spec/services/product_tag_rules_filterer_spec.rb +++ b/spec/services/product_tag_rules_filterer_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe ProductTagRulesFilterer do +RSpec.describe ProductTagRulesFilterer do describe "filtering by tag rules" do let!(:distributor) { create(:distributor_enterprise) } let(:product) { create(:product, supplier: distributor) } diff --git a/spec/services/products_renderer_spec.rb b/spec/services/products_renderer_spec.rb index 179233fe2d7..0913c61ee9e 100644 --- a/spec/services/products_renderer_spec.rb +++ b/spec/services/products_renderer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe ProductsRenderer do +RSpec.describe ProductsRenderer do let(:distributor) { create(:distributor_enterprise) } let(:order_cycle) { create(:simple_order_cycle, distributors: [distributor]) } let(:exchange) { order_cycle.exchanges.to_enterprises(distributor).outgoing.first } diff --git a/spec/services/search_orders_spec.rb b/spec/services/search_orders_spec.rb index 6abf20fcf53..3b3de62b4e2 100644 --- a/spec/services/search_orders_spec.rb +++ b/spec/services/search_orders_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe SearchOrders do +RSpec.describe SearchOrders do let!(:distributor) { create(:distributor_enterprise) } let!(:order1) { create(:order_with_line_items, distributor:, line_items_count: 3) } let!(:order2) { create(:order_with_line_items, distributor:, line_items_count: 2) } diff --git a/spec/services/sets/model_set_spec.rb b/spec/services/sets/model_set_spec.rb index b783872f9e0..bf9f7b37ec8 100644 --- a/spec/services/sets/model_set_spec.rb +++ b/spec/services/sets/model_set_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Sets::ModelSet do +RSpec.describe Sets::ModelSet do describe "updating" do it "creates new models" do attrs = { collection_attributes: { '1' => { name: "Fantasia", iso_name: "FAN" }, diff --git a/spec/services/sets/product_set_spec.rb b/spec/services/sets/product_set_spec.rb index 88eb990e9d8..3d2181c493a 100644 --- a/spec/services/sets/product_set_spec.rb +++ b/spec/services/sets/product_set_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Sets::ProductSet do +RSpec.describe Sets::ProductSet do describe '#save' do let(:product_set) do described_class.new(collection_attributes: collection_hash) @@ -134,6 +134,27 @@ end end end + + context "when product attributes are not changed" do + let(:collection_hash) { + { 0 => { id: product.id, name: product.name } } + } + + it 'returns true' do + is_expected.to eq true + end + + it 'does not increase saved_count' do + subject + expect(product_set.saved_count).to eq 0 + end + + it 'does not update any product by calling save' do + expect_any_instance_of(Spree::Product).not_to receive(:save) + + subject + end + end end describe "updating a product's variants" do @@ -190,6 +211,23 @@ include_examples "nothing saved" end + context "when attributes are not changed" do + let(:variant_attributes) { { sku: variant.sku } } + + before { variant } + + it 'updates product by calling save' do + expect_any_instance_of(Spree::Variant).not_to receive(:save) + + subject + end + + it 'does not increase saved_count' do + subject + expect(product_set.saved_count).to eq 0 + end + end + context "when products attributes are also updated" do let(:product_attributes) { { sku: "prod_sku" } diff --git a/spec/services/shop/order_cycles_list_spec.rb b/spec/services/shop/order_cycles_list_spec.rb index 30febf01e2e..5b5e230fb12 100644 --- a/spec/services/shop/order_cycles_list_spec.rb +++ b/spec/services/shop/order_cycles_list_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Shop::OrderCyclesList do +RSpec.describe Shop::OrderCyclesList do describe ".active_for" do let(:customer) { nil } diff --git a/spec/services/stripe_payment_status_spec.rb b/spec/services/stripe_payment_status_spec.rb index 3e9b17fa211..08e8b7f234b 100644 --- a/spec/services/stripe_payment_status_spec.rb +++ b/spec/services/stripe_payment_status_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe StripePaymentStatus, :vcr, :stripe_version do +RSpec.describe StripePaymentStatus, :vcr, :stripe_version do subject { StripePaymentStatus.new(payment) } let(:credit_card) { create(:credit_card, gateway_payment_profile_id: pm_card.id) } diff --git a/spec/services/tax_rate_finder_spec.rb b/spec/services/tax_rate_finder_spec.rb index 3ceca796074..0464565ef02 100644 --- a/spec/services/tax_rate_finder_spec.rb +++ b/spec/services/tax_rate_finder_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe TaxRateFinder do +RSpec.describe TaxRateFinder do describe "getting the corresponding tax rate" do let(:amount) { BigDecimal(120) } let(:tax_rate) { diff --git a/spec/services/tax_rate_updater_spec.rb b/spec/services/tax_rate_updater_spec.rb index baa3b6d4a66..93c3223220a 100644 --- a/spec/services/tax_rate_updater_spec.rb +++ b/spec/services/tax_rate_updater_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe TaxRateUpdater do +RSpec.describe TaxRateUpdater do let!(:old_tax_rate) { create(:tax_rate, name: "Test Rate", amount: 0.2, calculator: Calculator::DefaultTax.new) } diff --git a/spec/services/terms_of_service_spec.rb b/spec/services/terms_of_service_spec.rb index 22151ee0bcb..c2b4021b7e5 100644 --- a/spec/services/terms_of_service_spec.rb +++ b/spec/services/terms_of_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe TermsOfService do +RSpec.describe TermsOfService do let(:customer) { create(:customer) } let(:distributor) { create(:distributor_enterprise) } diff --git a/spec/services/unit_prices_spec.rb b/spec/services/unit_prices_spec.rb index ef9aa86bee3..2219eab6c8e 100644 --- a/spec/services/unit_prices_spec.rb +++ b/spec/services/unit_prices_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe UnitPrice do +RSpec.describe UnitPrice do subject { UnitPrice.new(variant) } let(:variant) { Spree::Variant.new } let(:product) { instance_double(Spree::Product) } diff --git a/spec/services/upload_sanitizer_spec.rb b/spec/services/upload_sanitizer_spec.rb index c90625fe726..e766fa7ec86 100644 --- a/spec/services/upload_sanitizer_spec.rb +++ b/spec/services/upload_sanitizer_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe UploadSanitizer do +RSpec.describe UploadSanitizer do describe "#call" do let(:upload) do File.open("/tmp/unsanitized.csv", 'wb:ascii-8bit') do |f| diff --git a/spec/services/url_generator_spec.rb b/spec/services/url_generator_spec.rb index f33c093bf9d..fcb0d78edd9 100644 --- a/spec/services/url_generator_spec.rb +++ b/spec/services/url_generator_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe UrlGenerator do +RSpec.describe UrlGenerator do subject { UrlGenerator } describe "#to_url" do diff --git a/spec/services/user_default_address_setter_spec.rb b/spec/services/user_default_address_setter_spec.rb index 2e8ec3319d8..e90d53b32b3 100644 --- a/spec/services/user_default_address_setter_spec.rb +++ b/spec/services/user_default_address_setter_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe UserDefaultAddressSetter do +RSpec.describe UserDefaultAddressSetter do let(:customer_address) { create(:address, address1: "customer road") } let(:order_address) { create(:address, address1: "order road") } let(:customer) do diff --git a/spec/services/user_locale_setter_spec.rb b/spec/services/user_locale_setter_spec.rb index 5b0bc0e69b0..9e3223c52e8 100644 --- a/spec/services/user_locale_setter_spec.rb +++ b/spec/services/user_locale_setter_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe UserLocaleSetter do +RSpec.describe UserLocaleSetter do let(:user) { create(:user) } let(:default_locale) { I18n.default_locale } let(:locale_params) { {} } diff --git a/spec/services/variant_overrides_indexed_spec.rb b/spec/services/variant_overrides_indexed_spec.rb index 62cc1e6228f..d789c048c7e 100644 --- a/spec/services/variant_overrides_indexed_spec.rb +++ b/spec/services/variant_overrides_indexed_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe VariantOverridesIndexed do +RSpec.describe VariantOverridesIndexed do subject(:variant_overrides) { described_class.new([variant.id], [distributor.id]) } let(:distributor) { create(:distributor_enterprise) } diff --git a/spec/services/variant_units/option_value_namer_spec.rb b/spec/services/variant_units/option_value_namer_spec.rb index 6d71ac39664..8c2ac4f5378 100644 --- a/spec/services/variant_units/option_value_namer_spec.rb +++ b/spec/services/variant_units/option_value_namer_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' module VariantUnits - describe OptionValueNamer do + RSpec.describe OptionValueNamer do describe "generating option value name" do let(:v) { Spree::Variant.new } let(:p) { Spree::Product.new } diff --git a/spec/services/variants_stock_levels_spec.rb b/spec/services/variants_stock_levels_spec.rb index 475f9fb4523..630fc2c2de9 100644 --- a/spec/services/variants_stock_levels_spec.rb +++ b/spec/services/variants_stock_levels_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe VariantsStockLevels do +RSpec.describe VariantsStockLevels do let(:order) { create(:order) } let!(:line_item) do diff --git a/spec/services/voucher_adjustments_service_spec.rb b/spec/services/voucher_adjustments_service_spec.rb index 87df60558e5..d9f05fb1dff 100644 --- a/spec/services/voucher_adjustments_service_spec.rb +++ b/spec/services/voucher_adjustments_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe VoucherAdjustmentsService do +RSpec.describe VoucherAdjustmentsService do describe '#update' do let(:enterprise) { build(:enterprise) } diff --git a/spec/services/weights_and_measures_spec.rb b/spec/services/weights_and_measures_spec.rb index 59877062ec7..22d337308ce 100644 --- a/spec/services/weights_and_measures_spec.rb +++ b/spec/services/weights_and_measures_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe WeightsAndMeasures do +RSpec.describe WeightsAndMeasures do subject { WeightsAndMeasures.new(variant) } let(:variant) { Spree::Variant.new } let(:product) { instance_double(Spree::Product) } diff --git a/spec/support/checkout_helper.rb b/spec/support/checkout_helper.rb index fd85d4a7793..6fa1bbd6aa2 100644 --- a/spec/support/checkout_helper.rb +++ b/spec/support/checkout_helper.rb @@ -66,4 +66,12 @@ def place_order click_on "Complete order" expect(page).to have_content "Back To Store" end + + def out_of_stock_check(step) + visit checkout_step_path(step) + + expect(page).not_to have_selector 'closing', text: "Checkout now" + expect(page).to have_selector 'closing', text: "Your shopping cart" + expect(page).to have_content "An item in your cart has become unavailable" + end end diff --git a/spec/support/features/datepicker_helper.rb b/spec/support/features/datepicker_helper.rb index 3840670f54c..ffcfd8ef814 100644 --- a/spec/support/features/datepicker_helper.rb +++ b/spec/support/features/datepicker_helper.rb @@ -54,7 +54,7 @@ def datepicker_month_and_year "select.flatpickr-monthDropdown-months").value.to_i + 1 year = find(".flatpickr-calendar.open .flatpickr-current-month " \ ".numInputWrapper .cur-year").value - month.to_s + " " + year.to_s + "#{month} #{year}" end def pick_datetime(calendar_selector, datetime_selector) diff --git a/spec/support/precompile_assets.rb b/spec/support/precompile_assets.rb index 762a1c27b7f..edab33e902b 100644 --- a/spec/support/precompile_assets.rb +++ b/spec/support/precompile_assets.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true RSpec.configure do |config| - config.before(:suite) do + config.before(:all) do # We can use webpack-dev-server for tests, too! # Useful if you working on a frontend code fixes and want to verify them via system tests. next if Webpacker.dev_server.running? diff --git a/spec/support/request/admin_helper.rb b/spec/support/request/admin_helper.rb index 60e0fcdbd4d..eb06f34b12f 100644 --- a/spec/support/request/admin_helper.rb +++ b/spec/support/request/admin_helper.rb @@ -3,10 +3,10 @@ module AdminHelper def toggle_columns(*labels) # open dropdown - # case insensitive search for "Columns" text - find("div#columns-dropdown", text: /columns/i).click + columns_dropdown = ofn_drop_down("Columns") + columns_dropdown.click - within "div#columns-dropdown" do + within columns_dropdown do labels.each do |label| # Convert label to case-insensitive regexp if not one already label = /#{label}/i unless label.is_a?(Regexp) @@ -16,6 +16,10 @@ def toggle_columns(*labels) end # close dropdown - find("div#columns-dropdown", text: /columns/i).click + columns_dropdown.click + end + + def ofn_drop_down(label) + find(".ofn-drop-down", text: /#{label}/i) end end diff --git a/spec/support/request/tomselect_helper.rb b/spec/support/request/tomselect_helper.rb new file mode 100644 index 00000000000..7cce8cbe9ed --- /dev/null +++ b/spec/support/request/tomselect_helper.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module TomselectHelper + def tomselect_open(field_name) + page.find("##{field_name}-ts-control").click + end + + def tomselect_multiselect(value, options) + tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") + tomselect_wrapper.find(".ts-control").click + tomselect_wrapper.find(:css, '.ts-dropdown.multi .ts-dropdown-content .option', + text: value).click + end + + def tomselect_search_and_select(value, options) + tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") + tomselect_wrapper.find(".ts-control").click + # Use send_keys as setting the value directly doesn't trigger the search + tomselect_wrapper.find(:css, '.ts-dropdown input.dropdown-input').send_keys(value) + tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option', text: value).click + end + + def tomselect_select(value, options) + tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") + tomselect_wrapper.find(".ts-control").click + + tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option', text: value).click + end + + def open_tomselect_to_validate!(page, field_name) + tomselect_wrapper = page.find_field(field_name).sibling(".ts-wrapper") + tomselect_wrapper.find(".ts-control").click # open the dropdown + + raise 'Please pass the block for expectations' unless block_given? + + # execute block containing expectations + yield + + tomselect_wrapper.find( + '.ts-dropdown .ts-dropdown-content .option.active', + ).click # close the dropdown by selecting the already selected value + end +end diff --git a/spec/support/request/web_helper.rb b/spec/support/request/web_helper.rb index 42d7cb65b64..a5c4924a835 100644 --- a/spec/support/request/web_helper.rb +++ b/spec/support/request/web_helper.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true module WebHelper + include TomselectHelper + def have_input(name, opts = {}) selector = "[name='#{name}']" selector += "[placeholder='#{opts[:placeholder]}']" if opts.key? :placeholder @@ -86,32 +88,6 @@ def click_on_select2(value, options) find(:css, ".select2-result-label", text: options[:select_text] || value).click end - def tomselect_open(field_name) - page.find("##{field_name}-ts-control").click - end - - def tomselect_multiselect(value, options) - tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") - tomselect_wrapper.find(".ts-control").click - tomselect_wrapper.find(:css, '.ts-dropdown.multi .ts-dropdown-content .option', - text: value).click - end - - def tomselect_search_and_select(value, options) - tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") - tomselect_wrapper.find(".ts-control").click - # Use send_keys as setting the value directly doesn't trigger the search - tomselect_wrapper.find(:css, '.ts-dropdown input.dropdown-input').send_keys(value) - tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option', text: value).click - end - - def tomselect_select(value, options) - tomselect_wrapper = page.find_field(options[:from]).sibling(".ts-wrapper") - tomselect_wrapper.find(".ts-control").click - - tomselect_wrapper.find(:css, '.ts-dropdown .ts-dropdown-content .option', text: value).click - end - def request_monitor_finished(controller = nil) page.evaluate_script("#{angular_scope(controller)}.scope().RequestMonitor.loading == false") end diff --git a/spec/support/vcr_setup.rb b/spec/support/vcr_setup.rb index 1b554f52f2b..bf2574a0b35 100644 --- a/spec/support/vcr_setup.rb +++ b/spec/support/vcr_setup.rb @@ -7,7 +7,7 @@ config.hook_into :webmock config.ignore_localhost = true config.configure_rspec_metadata! - config.ignore_hosts('localhost', '127.0.0.1', '0.0.0.0', 'api.knapsackpro.com') + config.ignore_localhost = true # Filter sensitive environment variables %w[ @@ -40,4 +40,9 @@ config.filter_sensitive_data('') { |interaction| interaction.response.body.match(/"refresh_token":"([^"]+)"/)&.public_send(:[], 1) } + + # FDC specific parameter: + config.filter_sensitive_data('') { |interaction| + interaction.request.body.match(/"accessToken":"([^"]+)"/)&.public_send(:[], 1) + } end diff --git a/spec/swagger_helper.rb b/spec/swagger_helper.rb index 0a131fb5ffe..b3a3676cbcd 100644 --- a/spec/swagger_helper.rb +++ b/spec/swagger_helper.rb @@ -75,7 +75,7 @@ module RswagExtension def param(args, &) - public_send(:let, args) { instance_eval(&) } + let(args) { instance_eval(&) } end end Rswag::Specs::ExampleGroupHelpers.prepend RswagExtension diff --git a/spec/system/admin/adjustments_spec.rb b/spec/system/admin/adjustments_spec.rb index cbe5f8f7d57..bc525c819e6 100644 --- a/spec/system/admin/adjustments_spec.rb +++ b/spec/system/admin/adjustments_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe ' +RSpec.describe ' As an administrator I want to manage adjustments on orders ' do diff --git a/spec/system/admin/authentication_spec.rb b/spec/system/admin/authentication_spec.rb index 426ac758a83..80bedbd3c95 100644 --- a/spec/system/admin/authentication_spec.rb +++ b/spec/system/admin/authentication_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Authentication" do +RSpec.describe "Authentication" do include UIComponentHelper include AuthenticationHelper include WebHelper @@ -10,21 +10,27 @@ let(:user) { create(:user, password: "password", password_confirmation: "password") } let!(:enterprise) { create(:enterprise, owner: user) } # Required for access to admin - it "logging into admin redirects home, then back to admin" do - visit spree.admin_dashboard_path + context "as anonymous user" do + it "logging into admin redirects home, then back to admin" do + visit spree.admin_dashboard_path - fill_in "Email", with: user.email - fill_in "Password", with: user.password - click_login_button - expect(page).to have_content "DASHBOARD" - expect(page).to have_current_path spree.admin_dashboard_path - expect(page).not_to have_content "CONFIGURATION" - end + fill_in "Email", with: user.email + fill_in "Password", with: user.password + click_login_button + expect(page).to have_content "DASHBOARD" + expect(page).to have_current_path spree.admin_dashboard_path + expect(page).not_to have_content "CONFIGURATION" + end - it "viewing my account" do - login_to_admin_section - click_link "Account" - expect(page).to have_current_path spree.account_path + it "viewing my account" do + login_to_admin_section + click_link "Account" + expect(page).to have_current_path spree.account_path + end + + it "is redirected to login page when attempting to access product listing" do + expect { visit spree.admin_products_path }.not_to raise_error + end end context "logged in" do diff --git a/spec/system/admin/bulk_order_cancellation_spec.rb b/spec/system/admin/bulk_order_cancellation_spec.rb index c07ccfe9e17..bb2084976f6 100644 --- a/spec/system/admin/bulk_order_cancellation_spec.rb +++ b/spec/system/admin/bulk_order_cancellation_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an Administrator I want to be able to delete orders in bulk ' do diff --git a/spec/system/admin/bulk_order_management_spec.rb b/spec/system/admin/bulk_order_management_spec.rb index ccf0141afd4..8e00eff1398 100644 --- a/spec/system/admin/bulk_order_management_spec.rb +++ b/spec/system/admin/bulk_order_management_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an Administrator I want to be able to manage orders in bulk ' do diff --git a/spec/system/admin/bulk_product_update_spec.rb b/spec/system/admin/bulk_product_update_spec.rb index 1f954dc1424..7ccab2766a5 100644 --- a/spec/system/admin/bulk_product_update_spec.rb +++ b/spec/system/admin/bulk_product_update_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an Administrator I want to be able to manage products in bulk ' do diff --git a/spec/system/admin/configuration/content_spec.rb b/spec/system/admin/configuration/content_spec.rb index a74bd03421a..8e44066e70c 100644 --- a/spec/system/admin/configuration/content_spec.rb +++ b/spec/system/admin/configuration/content_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe " +RSpec.describe " As a site administrator I want to configure the site content " do diff --git a/spec/system/admin/configuration/general_settings_spec.rb b/spec/system/admin/configuration/general_settings_spec.rb index ddbf01bbd3c..cc352c745be 100644 --- a/spec/system/admin/configuration/general_settings_spec.rb +++ b/spec/system/admin/configuration/general_settings_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "General Settings" do +RSpec.describe "General Settings" do include AuthenticationHelper before do diff --git a/spec/system/admin/configuration/mail_methods_spec.rb b/spec/system/admin/configuration/mail_methods_spec.rb index 0bf637ea583..643ee1dc7a9 100644 --- a/spec/system/admin/configuration/mail_methods_spec.rb +++ b/spec/system/admin/configuration/mail_methods_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Mail Methods" do +RSpec.describe "Mail Methods" do include AuthenticationHelper before do diff --git a/spec/system/admin/configuration/shipping_categories_spec.rb b/spec/system/admin/configuration/shipping_categories_spec.rb index 6b554852a45..7e884d0aebc 100644 --- a/spec/system/admin/configuration/shipping_categories_spec.rb +++ b/spec/system/admin/configuration/shipping_categories_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Shipping Categories" do +RSpec.describe "Shipping Categories" do include AuthenticationHelper include WebHelper let(:admin_role) { Spree::Role.find_or_create_by!(name: 'admin') } diff --git a/spec/system/admin/configuration/states_spec.rb b/spec/system/admin/configuration/states_spec.rb index 8f44e489576..0653a429f30 100644 --- a/spec/system/admin/configuration/states_spec.rb +++ b/spec/system/admin/configuration/states_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "States" do +RSpec.describe "States" do include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/configuration/tax_categories_spec.rb b/spec/system/admin/configuration/tax_categories_spec.rb index 61410c06637..ea5074d8bf7 100644 --- a/spec/system/admin/configuration/tax_categories_spec.rb +++ b/spec/system/admin/configuration/tax_categories_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Tax Categories" do +RSpec.describe "Tax Categories" do include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/configuration/tax_rates_spec.rb b/spec/system/admin/configuration/tax_rates_spec.rb index da48c549d81..87c60b2392d 100644 --- a/spec/system/admin/configuration/tax_rates_spec.rb +++ b/spec/system/admin/configuration/tax_rates_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Tax Rates" do +RSpec.describe "Tax Rates" do include AuthenticationHelper let!(:calculator) { create(:calculator_per_item, calculable: create(:order)) } diff --git a/spec/system/admin/configuration/taxonomies_spec.rb b/spec/system/admin/configuration/taxonomies_spec.rb index b5dea632fd9..5f4771cbd66 100644 --- a/spec/system/admin/configuration/taxonomies_spec.rb +++ b/spec/system/admin/configuration/taxonomies_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Taxonomies" do +RSpec.describe "Taxonomies" do include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/configuration/terms_of_service_files_spec.rb b/spec/system/admin/configuration/terms_of_service_files_spec.rb index fad947a0893..1a1ca75d3d0 100644 --- a/spec/system/admin/configuration/terms_of_service_files_spec.rb +++ b/spec/system/admin/configuration/terms_of_service_files_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Terms of Service files" do +RSpec.describe "Terms of Service files" do include AuthenticationHelper describe "as admin" do diff --git a/spec/system/admin/configuration/zones_spec.rb b/spec/system/admin/configuration/zones_spec.rb index 36e7bf9969d..134d4c14f7c 100644 --- a/spec/system/admin/configuration/zones_spec.rb +++ b/spec/system/admin/configuration/zones_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Zones" do +RSpec.describe "Zones" do include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/customers_spec.rb b/spec/system/admin/customers_spec.rb index b8ab97768e6..44417d2110b 100644 --- a/spec/system/admin/customers_spec.rb +++ b/spec/system/admin/customers_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Customers' do +RSpec.describe 'Customers' do include AdminHelper include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/dfc_product_import_spec.rb b/spec/system/admin/dfc_product_import_spec.rb index 195c8370c59..f02f4b55654 100644 --- a/spec/system/admin/dfc_product_import_spec.rb +++ b/spec/system/admin/dfc_product_import_spec.rb @@ -3,7 +3,7 @@ require 'system_helper' require_relative '../../../engines/dfc_provider/spec/support/authorization_helper' -describe "DFC Product Import" do +RSpec.describe "DFC Product Import" do include AuthorizationHelper let(:user) { create(:oidc_user, owned_enterprises: [enterprise]) } @@ -41,4 +41,27 @@ expect(page).to have_content "Importing a DFC product catalog" expect(page).to have_content "Imported products: 1" end + + it "imports from a FDC catalog", vcr: true do + user.oidc_account.update!( + uid: "testdfc@protonmail.com", + refresh_token: ENV.fetch("OPENID_REFRESH_TOKEN"), + updated_at: 1.day.ago, + ) + + visit admin_product_import_path + + select enterprise.name, from: "Enterprise" + + url = "https://food-data-collaboration-produc-fe870152f634.herokuapp.com/fdc/products?shop=test-hodmedod.myshopify.com" + fill_in "catalog_url", with: url + + expect { + click_button "Import" + }.to change { + enterprise.supplied_products.count + } + + expect(page).to have_content "Importing a DFC product catalog" + end end diff --git a/spec/system/admin/enterprise_fees_spec.rb b/spec/system/admin/enterprise_fees_spec.rb index 53dbaf2e33e..2c90e748e83 100644 --- a/spec/system/admin/enterprise_fees_spec.rb +++ b/spec/system/admin/enterprise_fees_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an administrator I want to manage enterprise fees ' do diff --git a/spec/system/admin/enterprise_groups_spec.rb b/spec/system/admin/enterprise_groups_spec.rb index d025aa8cc8c..786eb9df5e7 100644 --- a/spec/system/admin/enterprise_groups_spec.rb +++ b/spec/system/admin/enterprise_groups_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an administrator I want to manage enterprise groups ' do diff --git a/spec/system/admin/enterprise_relationships_spec.rb b/spec/system/admin/enterprise_relationships_spec.rb index 50b2b89e333..1e86c9d2295 100644 --- a/spec/system/admin/enterprise_relationships_spec.rb +++ b/spec/system/admin/enterprise_relationships_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an Administrator I want to manage relationships between enterprises ' do diff --git a/spec/system/admin/enterprise_roles_spec.rb b/spec/system/admin/enterprise_roles_spec.rb index 2b7be496cae..e3be5b58628 100644 --- a/spec/system/admin/enterprise_roles_spec.rb +++ b/spec/system/admin/enterprise_roles_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an Administrator I want to manage relationships between users and enterprises ' do diff --git a/spec/system/admin/enterprise_user_spec.rb b/spec/system/admin/enterprise_user_spec.rb index b8435cbef7a..ce04a151968 100644 --- a/spec/system/admin/enterprise_user_spec.rb +++ b/spec/system/admin/enterprise_user_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe ' +RSpec.describe ' As a Super User I want to setup users to manage an enterprise ' do diff --git a/spec/system/admin/enterprises/business_address_form_spec.rb b/spec/system/admin/enterprises/business_address_form_spec.rb index 37b82c84898..ffec4468a2b 100644 --- a/spec/system/admin/enterprises/business_address_form_spec.rb +++ b/spec/system/admin/enterprises/business_address_form_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "Business Address" do +RSpec.describe "Business Address" do include WebHelper include AuthenticationHelper diff --git a/spec/system/admin/enterprises/connected_apps_spec.rb b/spec/system/admin/enterprises/connected_apps_spec.rb index 2be667e9044..652982b0ed5 100644 --- a/spec/system/admin/enterprises/connected_apps_spec.rb +++ b/spec/system/admin/enterprises/connected_apps_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "Connected Apps", feature: :connected_apps, vcr: true do +RSpec.describe "Connected Apps", feature: :connected_apps, vcr: true do let(:enterprise) { create(:enterprise) } before do @@ -50,4 +50,14 @@ expect(page).not_to have_content "account is connected" expect(page).not_to have_link "Manage listing" end + + it "can't be enabled by non-manager" do + login_as create(:admin_user) + + visit "#{edit_admin_enterprise_path(enterprise)}#/connected_apps_panel" + expect(page).to have_content "Discover Regenerative" + + expect(page).to have_button("Allow data sharing", disabled: true) + expect(page).to have_content "Only managers can connect apps." + end end diff --git a/spec/system/admin/enterprises/images_spec.rb b/spec/system/admin/enterprises/images_spec.rb index f5f1ccdb970..972485d32a4 100644 --- a/spec/system/admin/enterprises/images_spec.rb +++ b/spec/system/admin/enterprises/images_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "Managing enterprise images" do +RSpec.describe "Managing enterprise images" do include WebHelper include FileHelper include AuthenticationHelper diff --git a/spec/system/admin/enterprises/index_spec.rb b/spec/system/admin/enterprises/index_spec.rb index c79780b4909..239ca72a922 100644 --- a/spec/system/admin/enterprises/index_spec.rb +++ b/spec/system/admin/enterprises/index_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Enterprises Index' do +RSpec.describe 'Enterprises Index' do include WebHelper include AuthenticationHelper diff --git a/spec/system/admin/enterprises/terms_and_conditions_spec.rb b/spec/system/admin/enterprises/terms_and_conditions_spec.rb index e8a5f33bd70..15301c37606 100644 --- a/spec/system/admin/enterprises/terms_and_conditions_spec.rb +++ b/spec/system/admin/enterprises/terms_and_conditions_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "Uploading Terms and Conditions PDF" do +RSpec.describe "Uploading Terms and Conditions PDF" do include AuthenticationHelper include FileHelper diff --git a/spec/system/admin/enterprises_spec.rb b/spec/system/admin/enterprises_spec.rb index 92fdf304d30..caabb4a0069 100644 --- a/spec/system/admin/enterprises_spec.rb +++ b/spec/system/admin/enterprises_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe ' +RSpec.describe ' As an administrator I want to manage enterprises ' do diff --git a/spec/system/admin/flatpickr_spec.rb b/spec/system/admin/flatpickr_spec.rb index 901566a0eb7..434b24a2b00 100644 --- a/spec/system/admin/flatpickr_spec.rb +++ b/spec/system/admin/flatpickr_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "Test Flatpickr" do +RSpec.describe "Test Flatpickr" do include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/invoice_print_spec.rb b/spec/system/admin/invoice_print_spec.rb index e4246a9d698..9596a7d1919 100644 --- a/spec/system/admin/invoice_print_spec.rb +++ b/spec/system/admin/invoice_print_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe ' +RSpec.describe ' As an administrator I want to print a invoice as PDF ', type: :feature do diff --git a/spec/system/admin/multilingual_spec.rb b/spec/system/admin/multilingual_spec.rb index 82e3894e6bc..e8de421d75e 100644 --- a/spec/system/admin/multilingual_spec.rb +++ b/spec/system/admin/multilingual_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Multilingual' do +RSpec.describe 'Multilingual' do include AuthenticationHelper include WebHelper let(:admin_role) { Spree::Role.find_or_create_by!(name: 'admin') } diff --git a/spec/system/admin/oidc_settings_spec.rb b/spec/system/admin/oidc_settings_spec.rb index 3402bc6797b..ca63a8b3e8f 100644 --- a/spec/system/admin/oidc_settings_spec.rb +++ b/spec/system/admin/oidc_settings_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "OIDC Settings" do +RSpec.describe "OIDC Settings" do it "requires login" do visit admin_oidc_settings_path expect(page).to have_button "Login" diff --git a/spec/system/admin/order_cycles/complex_creating_specific_time_spec.rb b/spec/system/admin/order_cycles/complex_creating_specific_time_spec.rb index ad5c8187219..958ca4931ae 100644 --- a/spec/system/admin/order_cycles/complex_creating_specific_time_spec.rb +++ b/spec/system/admin/order_cycles/complex_creating_specific_time_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an administrator I want to create/update complex order cycles with a specific time ' do diff --git a/spec/system/admin/order_cycles/complex_editing_exchange_same_enterprise_spec.rb b/spec/system/admin/order_cycles/complex_editing_exchange_same_enterprise_spec.rb index ac602ec42f6..fdc41f3ebea 100644 --- a/spec/system/admin/order_cycles/complex_editing_exchange_same_enterprise_spec.rb +++ b/spec/system/admin/order_cycles/complex_editing_exchange_same_enterprise_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an administrator I want to manage complex order cycles ' do diff --git a/spec/system/admin/order_cycles/complex_editing_multiple_product_pages_spec.rb b/spec/system/admin/order_cycles/complex_editing_multiple_product_pages_spec.rb index 122085e583e..ddc888700e1 100644 --- a/spec/system/admin/order_cycles/complex_editing_multiple_product_pages_spec.rb +++ b/spec/system/admin/order_cycles/complex_editing_multiple_product_pages_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an administrator I want to manage complex order cycles ' do @@ -36,10 +36,7 @@ end it "select all products" do - checkbox_id = "order_cycle_incoming_exchange_0_select_all_variants" - elmnt = find_field(id: checkbox_id) - scroll_to(elmnt, align: :top) - check checkbox_id + check "Select All 2 Variants" expect_all_products_loaded diff --git a/spec/system/admin/order_cycles/complex_editing_multiple_updation_spec.rb b/spec/system/admin/order_cycles/complex_editing_multiple_updation_spec.rb index ba68c626e57..5d744c1c713 100644 --- a/spec/system/admin/order_cycles/complex_editing_multiple_updation_spec.rb +++ b/spec/system/admin/order_cycles/complex_editing_multiple_updation_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an administrator I want to see alert for unsaved changes on order cycle edit page ' do diff --git a/spec/system/admin/order_cycles/complex_editing_spec.rb b/spec/system/admin/order_cycles/complex_editing_spec.rb index 1438de2510c..3635cf69e9d 100644 --- a/spec/system/admin/order_cycles/complex_editing_spec.rb +++ b/spec/system/admin/order_cycles/complex_editing_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an administrator I want to manage complex order cycles ' do diff --git a/spec/system/admin/order_cycles/complex_updating_specific_time_spec.rb b/spec/system/admin/order_cycles/complex_updating_specific_time_spec.rb index 3e7d02d2b3d..4d109e52435 100644 --- a/spec/system/admin/order_cycles/complex_updating_specific_time_spec.rb +++ b/spec/system/admin/order_cycles/complex_updating_specific_time_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -xdescribe ' +RSpec.xdescribe ' As an administrator I want to create/update complex order cycles with a specific time ' do diff --git a/spec/system/admin/order_cycles/list_spec.rb b/spec/system/admin/order_cycles/list_spec.rb index 308f95a36fe..2c956565556 100644 --- a/spec/system/admin/order_cycles/list_spec.rb +++ b/spec/system/admin/order_cycles/list_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an administrator I want to list and filter order cycles ' do diff --git a/spec/system/admin/order_cycles/simple_spec.rb b/spec/system/admin/order_cycles/simple_spec.rb index 087665d92d4..1ce165d630d 100644 --- a/spec/system/admin/order_cycles/simple_spec.rb +++ b/spec/system/admin/order_cycles/simple_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an administrator I want to manage simple order cycles ' do @@ -399,37 +399,44 @@ oc.update prefers_product_selection_from_coordinator_inventory_only: false end - shared_examples "inventory warning" do - |inventory_visible, inventory_only, it_description, expect_message| - before do - # hides/displays variant within coordinator's inventory - inventory_item_v1.update!(visible: inventory_visible) - # changes coordinator's inventory preferences - supplier_managed.update preferred_product_selection_from_inventory_only: inventory_only - end + it "shows a warning when going to 'outgoing products' tab" do + # hides/displays variant within coordinator's inventory + inventory_item_v1.update!(visible: false) + # changes coordinator's inventory preferences + supplier_managed.update preferred_product_selection_from_inventory_only: true - it "#{it_description} a warning when going to 'outgoing products' tab" do - visit edit_admin_order_cycle_path(oc) - click_link "Outgoing Products" - within "tr.distributor-#{distributor_managed.id}" do - page.find("td.products").click - end - - # we need this assertion here to assure there is enough time to - # toggle the variant box and evaluate the following assertion - expect(page).to have_content product.name.upcase - - # iterates between true / false, depending on the test case - expectation = expect_message ? :to : :not_to - expect(page).public_send(expectation, - have_content(%(No variant available for this product - (hidden via inventory settings)).squish)) + visit edit_admin_order_cycle_path(oc) + click_link "Outgoing Products" + within "tr.distributor-#{distributor_managed.id}" do + page.find("td.products").click end + + # we need this assertion here to assure there is enough time to + # toggle the variant box and evaluate the following assertion + expect(page).to have_content product.name.upcase + + expect(page).to have_content "No variant available for this product" end - it_behaves_like "inventory warning", false, true, "shows", true - it_behaves_like "inventory warning", false, false, "does not show", false do - before { pending("#11851") } + it "doesn't show a warning when going to 'outgoing products' tab" do + pending("#11851") + + # hides/displays variant within coordinator's inventory + inventory_item_v1.update!(visible: false) + # changes coordinator's inventory preferences + supplier_managed.update preferred_product_selection_from_inventory_only: false + + visit edit_admin_order_cycle_path(oc) + click_link "Outgoing Products" + within "tr.distributor-#{distributor_managed.id}" do + page.find("td.products").click + end + + # we need this assertion here to assure there is enough time to + # toggle the variant box and evaluate the following assertion + expect(page).to have_content product.name.upcase + + expect(page).not_to have_content "No variant available for this product" end end diff --git a/spec/system/admin/order_cycles_complex_nav_check_spec.rb b/spec/system/admin/order_cycles_complex_nav_check_spec.rb index 7fb590294b1..3c3bc5622c1 100644 --- a/spec/system/admin/order_cycles_complex_nav_check_spec.rb +++ b/spec/system/admin/order_cycles_complex_nav_check_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an administrator I want to be alerted when I navigate away from a dirty order cycle form ' do diff --git a/spec/system/admin/order_spec.rb b/spec/system/admin/order_spec.rb index f6f5f96fe06..55d91e9ef28 100644 --- a/spec/system/admin/order_spec.rb +++ b/spec/system/admin/order_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe ' +RSpec.describe ' As an administrator I want to create and edit orders ' do @@ -172,6 +172,25 @@ def new_order_with_distribution(distributor, order_cycle) expect(order.line_items.reload.map(&:product)).to include product end + context "When adding a product on an order with transaction fee" do + let(:order_with_fees) { create(:completed_order_with_fees, user:, distributor:, order_cycle: ) } + + it 'recalculates transaction fee' do + login_as_admin + visit spree.edit_admin_order_path(order_with_fees) + + adjustment_for_transaction_fee = order_with_fees.all_adjustments.payment_fee.eligible.first + transaction_fee = adjustment_for_transaction_fee.amount + + expect(page.find("#order_adjustments").text).to have_content(transaction_fee) + + select2_select product.name, from: 'add_variant_id', search: true + find('button.add_variant').click + expect(page).to have_css("#order_adjustments", + text: adjustment_for_transaction_fee.reload.amount) + end + end + shared_examples_for "Cancelling the order" do it "shows a modal about order cancellation" do expect(page).to have_content "This will cancel the current order." @@ -968,13 +987,19 @@ def new_order_with_distribution(distributor, order_cycle) within ".reveal-modal" do expect(page).to have_checked_field('Send a shipment/pick up ' \ 'notification email to the customer.') - expect { - find_button("Confirm").click - }.to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:once) + find_button("Confirm").click end + expect(page).to have_selector('.reveal-modal', visible: false) + click_link('Order Details') unless subpage == 'Order Details' + + sleep(0.5) # avoid flakyness expect(order.reload.shipped?).to be true expect(page).to have_text 'SHIPPED' + expect(ActionMailer::MailDeliveryJob).to have_been_enqueued + .exactly(:once) + .with("Spree::ShipmentMailer", "shipped_email", "deliver_now", + { args: [order.shipment.id, { delivery: true }] }) end it "ships the order without sending email" do @@ -986,26 +1011,27 @@ def new_order_with_distribution(distributor, order_cycle) within ".reveal-modal" do uncheck 'Send a shipment/pick up notification email to the customer.' - expect { - find_button("Confirm").click - }.not_to enqueue_job(ActionMailer::MailDeliveryJob) + find_button("Confirm").click end + expect(page).to have_selector('.reveal-modal', visible: false) + click_link('Order Details') unless subpage == 'Order Details' + + sleep(0.5) # avoir flakyness expect(order.reload.shipped?).to be true expect(page).to have_text 'SHIPPED' + expect(ActionMailer::MailDeliveryJob).not_to have_been_enqueued + .with(array_including("Spree::ShipmentMailer")) end end end it_behaves_like "ship order from dropdown", "Order Details" - context "pending examples" do - before { pending("#12369") } - it_behaves_like "ship order from dropdown", "Customer Details" - it_behaves_like "ship order from dropdown", "Payments" - it_behaves_like "ship order from dropdown", "Adjustments" - it_behaves_like "ship order from dropdown", "Invoices" - it_behaves_like "ship order from dropdown", "Return Authorizations" - end + it_behaves_like "ship order from dropdown", "Customer Details" + it_behaves_like "ship order from dropdown", "Payments" + it_behaves_like "ship order from dropdown", "Adjustments" + it_behaves_like "ship order from dropdown", "Invoices" + it_behaves_like "ship order from dropdown", "Return Authorizations" end context "when an included variant has been deleted" do @@ -1133,165 +1159,4 @@ def searching_for_customers end end end - - describe "Legal Invoices", feature: :invoices do - before do - login_as user - end - - describe "for order states" do - context "complete" do - let!(:order1) { - create(:order_with_totals_and_distribution, user:, distributor:, - order_cycle:, state: 'complete', - payment_state: 'balance_due', - customer_id: customer.id) - } - - context "editing the order" do - before do - visit spree.edit_admin_order_path(order1) - end - - it "displays the invoice tab" do - expect(page).to have_content "Complete".upcase - expect(page).to have_content "Invoices".upcase - end - end - - context "visiting the invoices tab" do - let!(:table_header) { - [ - "Date/Time", - "Invoice Number", - "Amount", - "Status", - "File", - ].join(" ").upcase - } - - let(:invoice_number){ "#{order.distributor_id}-1" } - let(:table_contents) { - [ - Invoice.first.created_at.strftime('%B %d, %Y').to_s, - invoice_number, - "0.0", - "Active", - "Download" - ].join(" ") - } - let(:download_href) { - "#{spree.print_admin_order_path(order1)}?invoice_id=#{Invoice.last.id}" - } - - before do - Spree::Config[:enterprise_number_required_on_invoices?] = false - visit spree.admin_order_invoices_path(order1) - end - - it "displays the invoices table" do - # with no invoices, only the table header is displayed - expect(page).to have_css "table.index" - expect(page).to have_content "#{customer.first_name} #{customer.last_name} -" - expect(page.find("table").text).to have_content(table_header) - - # the New invoice button + the warning should be visible - expect(page).to have_link "Create or Update Invoice" - expect(page).to have_content "The order has changed since the last invoice update." - click_link "Create or Update Invoice" - - # and disappear after clicking - expect(page).not_to have_link "Create or Update Invoice" - expect(page).not_to have_content "The order has changed since the last invoice update." - - # creating an invoice, displays a second row - expect(page.find("table").text).to have_content(table_contents) - - # with a valid invoice download link - expect(page).to have_link("Download", - href: download_href) - end - - context "the Create or Update Invoice button" do - context "when an ABN number is mandatory for invoices but not present" do - before do - Spree::Config[:enterprise_number_required_on_invoices?] = true - end - - it "displays a warning that an ABN is required when it's clicked" do - visit spree.admin_order_invoices_path(order1) - message = accept_prompt { click_link "Create or Update Invoice" } - distributor = order1.distributor - expect(message) - .to eq "#{distributor.name} must have a valid ABN before invoices can be used." - end - end - end - end - end - - context "resumed" do - let!(:order2) { - create(:order_with_totals_and_distribution, user:, distributor:, - order_cycle:, state: 'resumed', - payment_state: 'balance_due') - } - before do - visit spree.edit_admin_order_path(order2) - end - - it "displays the invoice tab" do - expect(page).to have_content "Resumed".upcase - expect(page).to have_content "Invoices".upcase - end - end - - context "canceled" do - let!(:order3) { - create(:order_with_totals_and_distribution, user:, distributor:, - order_cycle:, state: 'canceled', - payment_state: 'balance_due') - } - before do - visit spree.edit_admin_order_path(order3) - end - - it "displays the invoice tab" do - expect(page).to have_content "Cancelled".upcase - expect(page).to have_content "Invoices".upcase - end - end - - context "cart" do - let!(:order_empty) { - create(:order_with_line_items, user:, distributor:, order_cycle:, - line_items_count: 0) - } - before do - visit spree.edit_admin_order_path(order_empty) - end - - it "should not display the invoice tab" do - expect(page).to have_content "Cart".upcase - expect(page).not_to have_content "Invoices".upcase - end - end - - context "payment" do - let!(:order4) do - create(:order_ready_for_payment, user:, distributor:, - order_cycle:, - payment_state: 'balance_due') - end - before do - visit spree.edit_admin_order_path(order4) - end - - it "should not display the invoice tab" do - expect(page).to have_content "Payment".upcase - expect(page).not_to have_content "Invoices".upcase - end - end - end - end end diff --git a/spec/system/admin/orders/bulk_actions_spec.rb b/spec/system/admin/orders/bulk_actions_spec.rb new file mode 100644 index 00000000000..e93cfe4b5f2 --- /dev/null +++ b/spec/system/admin/orders/bulk_actions_spec.rb @@ -0,0 +1,473 @@ +# frozen_string_literal: true + +require "system_helper" + +RSpec.describe ' + As an administrator + I want to perform bulk order actions +' do + include AuthenticationHelper + include WebHelper + + let(:owner) { create(:user) } + let(:owner2) { create(:user) } + let(:customer) { create(:user) } + let(:customer2) { create(:user) } + let(:customer3) { create(:user) } + let(:customer4) { create(:user) } + let(:customer5) { create(:user) } + let(:billing_address) { create(:address, :randomized) } + let(:billing_address2) { create(:address, :randomized) } + let(:billing_address3) { create(:address, :randomized) } + let(:billing_address4) { create(:address, :randomized) } + let(:billing_address5) { create(:address, :randomized) } + let(:product) { create(:simple_product) } + let(:distributor) { + create(:distributor_enterprise, owner:, with_payment_and_shipping: true, + charges_sales_tax: true) + } + let(:distributor2) { create(:distributor_enterprise_with_tax, owner:) } + let(:distributor3) { + create(:distributor_enterprise, owner:, with_payment_and_shipping: true, + charges_sales_tax: true) + } + let(:distributor4) { + create(:distributor_enterprise, owner:, with_payment_and_shipping: true, + charges_sales_tax: true) + } + let(:distributor5) { create(:distributor_enterprise, owner: owner2, charges_sales_tax: true) } + let!(:shipping_method) { + create(:shipping_method_with, :pickup, name: "pick_up", + distributors: [distributor, distributor2, distributor3]) + } + let!(:shipping_method2) { + create(:shipping_method_with, :pickup, name: "delivery", + distributors: [distributor4, distributor5]) + } + let(:order_cycle) do + create(:simple_order_cycle, name: 'One', distributors: [distributor, distributor2, + distributor3, distributor4], + variants: [product.variants.first]) + end + + context "with a complete order" do + let(:order) do + create(:order_with_totals_and_distribution, user: customer, distributor:, + order_cycle:, + state: 'complete', payment_state: 'balance_due', + bill_address_id: billing_address.id) + end + + let!(:order_cycle2) { + create(:simple_order_cycle, name: 'Two', orders_close_at: 2.weeks.from_now) + } + let!(:order_cycle3) { + create(:simple_order_cycle, name: 'Three', orders_close_at: 3.weeks.from_now) + } + let!(:order_cycle4) { + create(:simple_order_cycle, name: 'Four', orders_close_at: 4.weeks.from_now) + } + let!(:order_cycle5) do + create(:simple_order_cycle, name: 'Five', coordinator: distributor5, + distributors: [distributor5], variants: [product.variants.first]) + end + + let!(:order2) { + create(:order_ready_to_ship, user: customer2, distributor: distributor2, + order_cycle: order_cycle2, completed_at: 2.days.ago, + bill_address_id: billing_address2.id) + } + let!(:order3) { + create(:order_with_credit_payment, user: customer3, distributor: distributor3, + order_cycle: order_cycle3, + bill_address_id: billing_address3.id) + } + let!(:order4) { + create(:order_with_credit_payment, user: customer4, distributor: distributor4, + order_cycle: order_cycle4, + bill_address_id: billing_address4.id) + } + let!(:order5) { + create(:order_ready_to_ship, user: customer5, distributor: distributor5, + order_cycle: order_cycle5, + bill_address_id: billing_address5.id) + } + + context "as a super admin" do + before do + login_as_admin + visit spree.admin_orders_path + end + + context "can bulk send invoices per email" do + before do + Spree::Config[:enable_invoices?] = true + Spree::Config[:enterprise_number_required_on_invoices?] = false + end + + context "with multiple orders with differents states" do + before do + order2.update(state: "complete") + order3.update(state: "resumed") + order4.update(state: "canceled") + order5.update(state: "payment") + end + + it "can bulk send invoices per email, but only for the 'complete' or 'resumed' ones" do + within "#listing_orders" do + page.find("input[name='bulk_ids[]'][value='#{order2.id}']").click + page.find("input[name='bulk_ids[]'][value='#{order3.id}']").click + page.find("input[name='bulk_ids[]'][value='#{order4.id}']").click + page.find("input[name='bulk_ids[]'][value='#{order5.id}']").click + end + + page.find("span.icon-reorder", text: "ACTIONS").click + within ".ofn-drop-down .menu" do + page.find("span", text: "Send Invoices").click + end + + expect(page).to have_content "This will email customer invoices " \ + "for all selected complete orders." + expect(page).to have_content "Are you sure you want to proceed?" + + within ".reveal-modal" do + expect { + find_button("Confirm").click + }.to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice) + end + + expect(page).to have_content "Invoice emails sent for 2 orders." + end + end + + it "can bulk send confirmation email from 2 orders" do + page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").click + page.find("#listing_orders tbody tr:nth-child(2) input[name='bulk_ids[]']").click + + page.find("span.icon-reorder", text: "ACTIONS").click + within ".ofn-drop-down .menu" do + page.find("span", text: "Resend Confirmation").click + end + + expect(page).to have_content "Are you sure you want to proceed?" + + within ".reveal-modal" do + expect { + find_button("Confirm").click + }.to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice) + end + + expect(page).to have_content "Confirmation emails sent for 2 orders." + end + end + + context "can bulk print invoices" do + let(:order4_selector){ "#order_#{order4.id} input[name='bulk_ids[]']" } + let(:order5_selector){ "#order_#{order5.id} input[name='bulk_ids[]']" } + + shared_examples "can bulk print invoices from 2 orders" do + it "bulk prints invoices in pdf format" do + page.find(order4_selector).click + page.find(order5_selector).click + + page.find("span.icon-reorder", text: "ACTIONS").click + within ".ofn-drop-down .menu" do + expect { + page.find("span", text: "Print Invoices").click # Prints invoices in bulk + }.to enqueue_job(BulkInvoiceJob).exactly(:once) + end + + expect(page).to have_content "Compiling Invoices" + expect(page).to have_content "Please wait until the PDF is ready " \ + "before closing this modal." + + # we don't run Sidekiq in test environment, so we need to manually run enqueued jobs + # to generate PDF files, and change the modal accordingly + perform_enqueued_jobs(only: BulkInvoiceJob) + + expect(page).to have_content "Bulk Invoice created" + + within ".modal-content" do + expect(page).to have_link(class: "button", text: "VIEW FILE", href: /invoices/) + + invoice_content = extract_pdf_content + + expect(invoice_content).to have_content("TAX INVOICE", count: 2) + expect(invoice_content).to have_content(order4.number.to_s) + expect(invoice_content).to have_content(order5.number.to_s) + expect(invoice_content).to have_content(distributor4.name.to_s) + expect(invoice_content).to have_content(distributor5.name.to_s) + expect(invoice_content).to have_content(order_cycle4.name.to_s) + expect(invoice_content).to have_content(order_cycle5.name.to_s) + end + end + end + + shared_examples "should ignore the non invoiceable order" do + it "bulk prints invoices in pdf format" do + page.find(order4_selector).click + page.find(order5_selector).click + + page.find("span.icon-reorder", text: "ACTIONS").click + within ".ofn-drop-down .menu" do + expect { + page.find("span", text: "Print Invoices").click # Prints invoices in bulk + }.to enqueue_job(BulkInvoiceJob).exactly(:once) + end + + expect(page).to have_content "Compiling Invoices" + expect(page).to have_content "Please wait until the PDF is ready " \ + "before closing this modal." + + perform_enqueued_jobs(only: BulkInvoiceJob) + + expect(page).to have_content "Bulk Invoice created" + + within ".modal-content" do + expect(page).to have_link(class: "button", text: "VIEW FILE", + href: /invoices/) + + invoice_content = extract_pdf_content + + expect(invoice_content).to have_content("TAX INVOICE", count: 1) + expect(invoice_content).not_to have_content(order4.number.to_s) + expect(invoice_content).to have_content(order5.number.to_s) + expect(invoice_content).not_to have_content(distributor4.name.to_s) + expect(invoice_content).to have_content(distributor5.name.to_s) + expect(invoice_content).not_to have_content(order_cycle4.name.to_s) + expect(invoice_content).to have_content(order_cycle5.name.to_s) + end + end + end + + context "ABN is not required" do + before do + allow(Spree::Config).to receive(:enterprise_number_required_on_invoices?) + .and_return false + end + + it_behaves_like "can bulk print invoices from 2 orders" + + context "with legal invoices feature", feature: :invoices do + it_behaves_like "can bulk print invoices from 2 orders" + end + + context "one of the two orders is not invoiceable" do + before do + order4.cancel! + end + + it_behaves_like "should ignore the non invoiceable order" + context "with legal invoices feature", feature: :invoices do + it_behaves_like "should ignore the non invoiceable order" + end + end + + context "ordering by customer name" do + context "ascending" do + let!(:surnames) { + [order2.name.gsub(/.* /, ""), order3.name.gsub(/.* /, ""), + order4.name.gsub(/.* /, ""), order5.name.gsub(/.* /, "")].sort + } + it "orders by customer name ascending" do + page.find('a', text: "NAME").click # orders alphabetically (asc) + sleep(0.5) # waits for column sorting + + page.find("#selectAll").click + + print_all_invoices + + invoice_content = extract_pdf_content + + expect( + invoice_content.join + ).to match(/#{surnames[0]}.*#{surnames[1]}.*#{surnames[2]}.*#{surnames[3]}/m) + end + end + context "descending" do + let!(:surnames) { + [order2.name.gsub(/.* /, ""), order3.name.gsub(/.* /, ""), + order4.name.gsub(/.* /, ""), order5.name.gsub(/.* /, "")].sort.reverse + } + it "order by customer name descending" do + page.find('a', text: "NAME").click # orders alphabetically (asc) + sleep(0.5) # waits for column sorting + page.find('a', text: "NAME").click # orders alphabetically (desc) + sleep(0.5) # waits for column sorting + + page.find("#selectAll").click + + print_all_invoices + + invoice_content = extract_pdf_content + + expect( + invoice_content.join + ).to match(/#{surnames[0]}.*#{surnames[1]}.*#{surnames[2]}.*#{surnames[3]}/m) + end + end + end + end + context "ABN is required" do + before do + allow(Spree::Config).to receive(:enterprise_number_required_on_invoices?) + .and_return true + end + context "All the distributors setup the ABN" do + before do + order4.distributor.update(abn: "123456789") + order5.distributor.update(abn: "987654321") + end + context "all the orders are invoiceable (completed/resumed)" do + it_behaves_like "can bulk print invoices from 2 orders" + context "with legal invoices feature", feature: :invoices do + it_behaves_like "can bulk print invoices from 2 orders" + end + end + + context "one of the two orders is not invoiceable" do + before do + order4.cancel! + end + + it_behaves_like "should ignore the non invoiceable order" + context "with legal invoices feature", feature: :invoices do + it_behaves_like "should ignore the non invoiceable order" + end + end + end + context "the distributor of one of the order didn't set the ABN" do + before do + order4.distributor.update(abn: "123456789") + order5.distributor.update(abn: nil) + end + + shared_examples "should not print the invoice" do + it "should render a warning message" do + page.find(order4_selector).click + page.find(order5_selector).click + + page.find("span.icon-reorder", text: "ACTIONS").click + within ".ofn-drop-down .menu" do + expect { + page.find("span", text: "Print Invoices").click # Prints invoices in bulk + }.not_to enqueue_job(BulkInvoiceJob) + end + + expect(page).not_to have_content "Compiling Invoices" + expect(page).not_to have_content "Please wait until the PDF is ready " \ + "before closing this modal." + + expect(page).to have_content "#{ + order5.distributor.name + } must have a valid ABN before invoices can be used." + end + end + it_behaves_like "should not print the invoice" + context "with legal invoices feature", feature: :invoices do + it_behaves_like "should not print the invoice" + end + end + end + end + it "can bulk cancel 2 orders" do + page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").click + page.find("#listing_orders tbody tr:nth-child(2) input[name='bulk_ids[]']").click + + page.find("span.icon-reorder", text: "ACTIONS").click + within ".ofn-drop-down .menu" do + page.find("span", text: "Cancel Orders").click + end + + expect(page).to have_content "Are you sure you want to proceed?" + expect(page).to have_content "This will cancel the current order." + + within ".reveal-modal" do + uncheck "Send a cancellation email to the customer" + expect { + find_button("Cancel").click # Cancels the cancel action + }.not_to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice) + end + + page.find("span.icon-reorder", text: "ACTIONS").click + within ".ofn-drop-down .menu" do + page.find("span", text: "Cancel Orders").click + end + + within ".reveal-modal" do + expect { + find_button("Confirm").click # Confirms the cancel action + }.not_to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice) + end + + expect(page).to have_content("CANCELLED", count: 2) + end + end + + context "for a hub manager" do + before do + login_as owner2 + visit spree.admin_orders_path + end + + it "displays the orders for the respective distributor" do + expect(page).to have_content order5.number # displays the only order for distributor5 + expect(page).not_to have_content order.number + expect(page).not_to have_content order2.number + expect(page).not_to have_content order3.number + expect(page).not_to have_content order4.number + end + + it "cannot send emails to orders if permission have been revoked in the meantime" do + page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").click + # Find the clicked order + order = Spree::Order.find_by( + id: page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").value + ) + # Revoke permission for the current user on that specific order by changing its owners + order.update_attribute(:distributor, distributor) + order.update_attribute(:order_cycle, order_cycle) + + page.find("span.icon-reorder", text: "ACTIONS").click + within ".ofn-drop-down .menu" do + page.find("span", text: "Resend Confirmation").click + end + + expect(page).to have_content "Are you sure you want to proceed?" + + within ".reveal-modal" do + expect { + find_button("Confirm").click + }.not_to enqueue_job(ActionMailer::MailDeliveryJob) + end + end + end + end + + def extract_pdf_content + # Extract last part of invoice URL + link = page.find(class: "button", text: "VIEW FILE") + filename = link[:href].match %r{/invoices/.*} + + # Load invoice temp file directly instead of downloading + reader = PDF::Reader.new("tmp/#{filename}.pdf") + reader.pages.map(&:text) + end + + def print_all_invoices + page.find("span.icon-reorder", text: "ACTIONS").click + within ".ofn-drop-down .menu" do + expect { + page.find("span", text: "Print Invoices").click # Prints invoices in bulk + }.to enqueue_job(BulkInvoiceJob).exactly(:once) + end + + expect(page).to have_content "Compiling Invoices" + expect(page).to have_content "Please wait until the PDF is ready " \ + "before closing this modal." + + perform_enqueued_jobs(only: BulkInvoiceJob) + + expect(page).to have_content "Bulk Invoice created" + end +end diff --git a/spec/system/admin/orders/invoices_spec.rb b/spec/system/admin/orders/invoices_spec.rb index e57f83f350b..b101a28a7a5 100644 --- a/spec/system/admin/orders/invoices_spec.rb +++ b/spec/system/admin/orders/invoices_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an administrator I want to manage invoices for an order ', feature: :invoices do @@ -211,3 +211,178 @@ end end end + +RSpec.describe "Invoice order states", feature: :invoices do + let(:user) { create(:user) } + let(:product) { create(:simple_product) } + let(:distributor) { create(:distributor_enterprise, owner: user, charges_sales_tax: true) } + let(:order_cycle) do + create(:simple_order_cycle, name: 'One', distributors: [distributor], + variants: [product.variants.first]) + end + let(:order) do + create(:order_with_totals_and_distribution, user:, distributor:, + order_cycle:, state: 'complete', + payment_state: 'balance_due') + end + let(:customer) { order.customer } + + before do + order.finalize! + + login_as user + end + + context "complete" do + let!(:order1) { + create(:order_with_totals_and_distribution, user:, distributor:, + order_cycle:, state: 'complete', + payment_state: 'balance_due', + customer_id: customer.id) + } + + context "editing the order" do + before do + visit spree.edit_admin_order_path(order1) + end + + it "displays the invoice tab" do + expect(page).to have_content "Complete".upcase + expect(page).to have_content "Invoices".upcase + end + end + + context "visiting the invoices tab" do + let!(:table_header) { + [ + "Date/Time", + "Invoice Number", + "Amount", + "Status", + "File", + ].join(" ").upcase + } + + let(:invoice_number){ "#{order.distributor_id}-1" } + let(:table_contents) { + [ + Invoice.first.created_at.strftime('%B %d, %Y').to_s, + invoice_number, + "0.0", + "Active", + "Download" + ].join(" ") + } + let(:download_href) { + "#{spree.print_admin_order_path(order1)}?invoice_id=#{Invoice.last.id}" + } + + before do + Spree::Config[:enterprise_number_required_on_invoices?] = false + visit spree.admin_order_invoices_path(order1) + end + + it "displays the invoices table" do + # with no invoices, only the table header is displayed + expect(page).to have_css "table.index" + expect(page).to have_content "#{customer.first_name} #{customer.last_name} -" + expect(page.find("table").text).to have_content(table_header) + + # the New invoice button + the warning should be visible + expect(page).to have_link "Create or Update Invoice" + expect(page).to have_content "The order has changed since the last invoice update." + click_link "Create or Update Invoice" + + # and disappear after clicking + expect(page).not_to have_link "Create or Update Invoice" + expect(page).not_to have_content "The order has changed since the last invoice update." + + # creating an invoice, displays a second row + expect(page.find("table").text).to have_content(table_contents) + + # with a valid invoice download link + expect(page).to have_link("Download", + href: download_href) + end + + context "the Create or Update Invoice button" do + context "when an ABN number is mandatory for invoices but not present" do + before do + Spree::Config[:enterprise_number_required_on_invoices?] = true + end + + it "displays a warning that an ABN is required when it's clicked" do + visit spree.admin_order_invoices_path(order1) + message = accept_prompt { click_link "Create or Update Invoice" } + distributor = order1.distributor + expect(message) + .to eq "#{distributor.name} must have a valid ABN before invoices can be used." + end + end + end + end + end + + context "resumed" do + let!(:order2) { + create(:order_with_totals_and_distribution, user:, distributor:, + order_cycle:, state: 'resumed', + payment_state: 'balance_due') + } + before do + visit spree.edit_admin_order_path(order2) + end + + it "displays the invoice tab" do + expect(page).to have_content "Resumed".upcase + expect(page).to have_content "Invoices".upcase + end + end + + context "canceled" do + let!(:order3) { + create(:order_with_totals_and_distribution, user:, distributor:, + order_cycle:, state: 'canceled', + payment_state: 'balance_due') + } + before do + visit spree.edit_admin_order_path(order3) + end + + it "displays the invoice tab" do + expect(page).to have_content "Cancelled".upcase + expect(page).to have_content "Invoices".upcase + end + end + + context "cart" do + let!(:order_empty) { + create(:order_with_line_items, user:, distributor:, order_cycle:, + line_items_count: 0) + } + before do + visit spree.edit_admin_order_path(order_empty) + end + + it "should not display the invoice tab" do + expect(page).to have_content "Cart".upcase + expect(page).not_to have_content "Invoices".upcase + end + end + + context "payment" do + let!(:order4) do + create(:order_ready_for_payment, user:, distributor:, + order_cycle:, + payment_state: 'balance_due') + end + before do + visit spree.edit_admin_order_path(order4) + end + + it "should not display the invoice tab" do + expect(page).to have_content "Payment".upcase + expect(page).not_to have_content "Invoices".upcase + end + end +end diff --git a/spec/system/admin/orders_spec.rb b/spec/system/admin/orders_spec.rb index d7b4ca715f3..deedf07e3f2 100644 --- a/spec/system/admin/orders_spec.rb +++ b/spec/system/admin/orders_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe ' +RSpec.describe ' As an administrator I want to manage orders ' do @@ -504,358 +504,6 @@ end end - context "bulk actions" do - context "as a super admin" do - before do - login_as_admin - visit spree.admin_orders_path - end - - context "can bulk send invoices per email" do - before do - Spree::Config[:enable_invoices?] = true - Spree::Config[:enterprise_number_required_on_invoices?] = false - end - - context "with multiple orders with differents states" do - before do - order2.update(state: "complete") - order3.update(state: "resumed") - order4.update(state: "canceled") - order5.update(state: "payment") - end - - it "can bulk send invoices per email, but only for the 'complete' or 'resumed' ones" do - within "#listing_orders" do - page.find("input[name='bulk_ids[]'][value='#{order2.id}']").click - page.find("input[name='bulk_ids[]'][value='#{order3.id}']").click - page.find("input[name='bulk_ids[]'][value='#{order4.id}']").click - page.find("input[name='bulk_ids[]'][value='#{order5.id}']").click - end - - page.find("span.icon-reorder", text: "ACTIONS").click - within ".ofn-drop-down .menu" do - page.find("span", text: "Send Invoices").click - end - - expect(page).to have_content "This will email customer invoices " \ - "for all selected complete orders." - expect(page).to have_content "Are you sure you want to proceed?" - - within ".reveal-modal" do - expect { - find_button("Confirm").click - }.to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice) - end - - expect(page).to have_content "Invoice emails sent for 2 orders." - end - end - - it "can bulk send confirmation email from 2 orders" do - page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").click - page.find("#listing_orders tbody tr:nth-child(2) input[name='bulk_ids[]']").click - - page.find("span.icon-reorder", text: "ACTIONS").click - within ".ofn-drop-down .menu" do - page.find("span", text: "Resend Confirmation").click - end - - expect(page).to have_content "Are you sure you want to proceed?" - - within ".reveal-modal" do - expect { - find_button("Confirm").click - }.to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice) - end - - expect(page).to have_content "Confirmation emails sent for 2 orders." - end - end - - context "can bulk print invoices" do - let(:order4_selector){ "#order_#{order4.id} input[name='bulk_ids[]']" } - let(:order5_selector){ "#order_#{order5.id} input[name='bulk_ids[]']" } - - shared_examples "can bulk print invoices from 2 orders" do - it "bulk prints invoices in pdf format" do - page.find(order4_selector).click - page.find(order5_selector).click - - page.find("span.icon-reorder", text: "ACTIONS").click - within ".ofn-drop-down .menu" do - expect { - page.find("span", text: "Print Invoices").click # Prints invoices in bulk - }.to enqueue_job(BulkInvoiceJob).exactly(:once) - end - - expect(page).to have_content "Compiling Invoices" - expect(page).to have_content "Please wait until the PDF is ready " \ - "before closing this modal." - - # we don't run Sidekiq in test environment, so we need to manually run enqueued jobs - # to generate PDF files, and change the modal accordingly - perform_enqueued_jobs(only: BulkInvoiceJob) - - expect(page).to have_content "Bulk Invoice created" - - within ".modal-content" do - expect(page).to have_link(class: "button", text: "VIEW FILE", href: /invoices/) - - invoice_content = extract_pdf_content - - expect(invoice_content).to have_content("TAX INVOICE", count: 2) - expect(invoice_content).to have_content(order4.number.to_s) - expect(invoice_content).to have_content(order5.number.to_s) - expect(invoice_content).to have_content(distributor4.name.to_s) - expect(invoice_content).to have_content(distributor5.name.to_s) - expect(invoice_content).to have_content(order_cycle4.name.to_s) - expect(invoice_content).to have_content(order_cycle5.name.to_s) - end - end - end - - shared_examples "should ignore the non invoiceable order" do - it "bulk prints invoices in pdf format" do - page.find(order4_selector).click - page.find(order5_selector).click - - page.find("span.icon-reorder", text: "ACTIONS").click - within ".ofn-drop-down .menu" do - expect { - page.find("span", text: "Print Invoices").click # Prints invoices in bulk - }.to enqueue_job(BulkInvoiceJob).exactly(:once) - end - - expect(page).to have_content "Compiling Invoices" - expect(page).to have_content "Please wait until the PDF is ready " \ - "before closing this modal." - - perform_enqueued_jobs(only: BulkInvoiceJob) - - expect(page).to have_content "Bulk Invoice created" - - within ".modal-content" do - expect(page).to have_link(class: "button", text: "VIEW FILE", - href: /invoices/) - - invoice_content = extract_pdf_content - - expect(invoice_content).to have_content("TAX INVOICE", count: 1) - expect(invoice_content).not_to have_content(order4.number.to_s) - expect(invoice_content).to have_content(order5.number.to_s) - expect(invoice_content).not_to have_content(distributor4.name.to_s) - expect(invoice_content).to have_content(distributor5.name.to_s) - expect(invoice_content).not_to have_content(order_cycle4.name.to_s) - expect(invoice_content).to have_content(order_cycle5.name.to_s) - end - end - end - - context "ABN is not required" do - before do - allow(Spree::Config).to receive(:enterprise_number_required_on_invoices?) - .and_return false - end - - it_behaves_like "can bulk print invoices from 2 orders" - - context "with legal invoices feature", feature: :invoices do - it_behaves_like "can bulk print invoices from 2 orders" - end - - context "one of the two orders is not invoiceable" do - before do - order4.cancel! - end - - it_behaves_like "should ignore the non invoiceable order" - context "with legal invoices feature", feature: :invoices do - it_behaves_like "should ignore the non invoiceable order" - end - end - - context "ordering by customer name" do - context "ascending" do - let!(:surnames) { - [order2.name.gsub(/.* /, ""), order3.name.gsub(/.* /, ""), - order4.name.gsub(/.* /, ""), order5.name.gsub(/.* /, "")].sort - } - it "orders by customer name ascending" do - page.find('a', text: "NAME").click # orders alphabetically (asc) - sleep(0.5) # waits for column sorting - - page.find("#selectAll").click - - print_all_invoices - - invoice_content = extract_pdf_content - - expect( - invoice_content.join - ).to match(/#{surnames[0]}.*#{surnames[1]}.*#{surnames[2]}.*#{surnames[3]}/m) - end - end - context "descending" do - let!(:surnames) { - [order2.name.gsub(/.* /, ""), order3.name.gsub(/.* /, ""), - order4.name.gsub(/.* /, ""), order5.name.gsub(/.* /, "")].sort.reverse - } - it "order by customer name descending" do - page.find('a', text: "NAME").click # orders alphabetically (asc) - sleep(0.5) # waits for column sorting - page.find('a', text: "NAME").click # orders alphabetically (desc) - sleep(0.5) # waits for column sorting - - page.find("#selectAll").click - - print_all_invoices - - invoice_content = extract_pdf_content - - expect( - invoice_content.join - ).to match(/#{surnames[0]}.*#{surnames[1]}.*#{surnames[2]}.*#{surnames[3]}/m) - end - end - end - end - context "ABN is required" do - before do - allow(Spree::Config).to receive(:enterprise_number_required_on_invoices?) - .and_return true - end - context "All the distributors setup the ABN" do - before do - order4.distributor.update(abn: "123456789") - order5.distributor.update(abn: "987654321") - end - context "all the orders are invoiceable (completed/resumed)" do - it_behaves_like "can bulk print invoices from 2 orders" - context "with legal invoices feature", feature: :invoices do - it_behaves_like "can bulk print invoices from 2 orders" - end - end - - context "one of the two orders is not invoiceable" do - before do - order4.cancel! - end - - it_behaves_like "should ignore the non invoiceable order" - context "with legal invoices feature", feature: :invoices do - it_behaves_like "should ignore the non invoiceable order" - end - end - end - context "the distributor of one of the order didn't set the ABN" do - before do - order4.distributor.update(abn: "123456789") - order5.distributor.update(abn: nil) - end - - shared_examples "should not print the invoice" do - it "should render a warning message" do - page.find(order4_selector).click - page.find(order5_selector).click - - page.find("span.icon-reorder", text: "ACTIONS").click - within ".ofn-drop-down .menu" do - expect { - page.find("span", text: "Print Invoices").click # Prints invoices in bulk - }.not_to enqueue_job(BulkInvoiceJob) - end - - expect(page).not_to have_content "Compiling Invoices" - expect(page).not_to have_content "Please wait until the PDF is ready " \ - "before closing this modal." - - expect(page).to have_content "#{ - order5.distributor.name - } must have a valid ABN before invoices can be used." - end - end - it_behaves_like "should not print the invoice" - context "with legal invoices feature", feature: :invoices do - it_behaves_like "should not print the invoice" - end - end - end - end - it "can bulk cancel 2 orders" do - page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").click - page.find("#listing_orders tbody tr:nth-child(2) input[name='bulk_ids[]']").click - - page.find("span.icon-reorder", text: "ACTIONS").click - within ".ofn-drop-down .menu" do - page.find("span", text: "Cancel Orders").click - end - - expect(page).to have_content "Are you sure you want to proceed?" - expect(page).to have_content "This will cancel the current order." - - within ".reveal-modal" do - uncheck "Send a cancellation email to the customer" - expect { - find_button("Cancel").click # Cancels the cancel action - }.not_to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice) - end - - page.find("span.icon-reorder", text: "ACTIONS").click - within ".ofn-drop-down .menu" do - page.find("span", text: "Cancel Orders").click - end - - within ".reveal-modal" do - expect { - find_button("Confirm").click # Confirms the cancel action - }.not_to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice) - end - - expect(page).to have_content("CANCELLED", count: 2) - end - end - - context "for a hub manager" do - before do - login_as owner2 - visit spree.admin_orders_path - end - - it "displays the orders for the respective distributor" do - expect(page).to have_content order5.number # displays the only order for distributor5 - expect(page).not_to have_content order.number - expect(page).not_to have_content order2.number - expect(page).not_to have_content order3.number - expect(page).not_to have_content order4.number - end - - it "cannot send emails to orders if permission have been revoked in the meantime" do - page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").click - # Find the clicked order - order = Spree::Order.find_by( - id: page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").value - ) - # Revoke permission for the current user on that specific order by changing its owners - order.update_attribute(:distributor, distributor) - order.update_attribute(:order_cycle, order_cycle) - - page.find("span.icon-reorder", text: "ACTIONS").click - within ".ofn-drop-down .menu" do - page.find("span", text: "Resend Confirmation").click - end - - expect(page).to have_content "Are you sure you want to proceed?" - - within ".reveal-modal" do - expect { - find_button("Confirm").click - }.not_to enqueue_job(ActionMailer::MailDeliveryJob) - end - end - end - end - context "pagination" do before do login_as_admin @@ -1131,30 +779,4 @@ expect(find("input.datepicker").value).to be_empty end end - def extract_pdf_content - # Extract last part of invoice URL - link = page.find(class: "button", text: "VIEW FILE") - filename = link[:href].match %r{/invoices/.*} - - # Load invoice temp file directly instead of downloading - reader = PDF::Reader.new("tmp/#{filename}.pdf") - reader.pages.map(&:text) - end - - def print_all_invoices - page.find("span.icon-reorder", text: "ACTIONS").click - within ".ofn-drop-down .menu" do - expect { - page.find("span", text: "Print Invoices").click # Prints invoices in bulk - }.to enqueue_job(BulkInvoiceJob).exactly(:once) - end - - expect(page).to have_content "Compiling Invoices" - expect(page).to have_content "Please wait until the PDF is ready " \ - "before closing this modal." - - perform_enqueued_jobs(only: BulkInvoiceJob) - - expect(page).to have_content "Bulk Invoice created" - end end diff --git a/spec/system/admin/overview_spec.rb b/spec/system/admin/overview_spec.rb index da77a83e398..9660f812ebf 100644 --- a/spec/system/admin/overview_spec.rb +++ b/spec/system/admin/overview_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As a backend user I want to be given information about the state of my enterprises, products and order cycles ' do diff --git a/spec/system/admin/payment_method_spec.rb b/spec/system/admin/payment_method_spec.rb index c7173c5d238..7dd66633a7d 100644 --- a/spec/system/admin/payment_method_spec.rb +++ b/spec/system/admin/payment_method_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe ' +RSpec.describe ' As a Super Admin I want to be able to set a distributor on each payment method ' do diff --git a/spec/system/admin/payments_spec.rb b/spec/system/admin/payments_spec.rb index e648c5698f9..c7a1afeef2e 100644 --- a/spec/system/admin/payments_spec.rb +++ b/spec/system/admin/payments_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an admin I want to manage payments ' do diff --git a/spec/system/admin/payments_stripe_spec.rb b/spec/system/admin/payments_stripe_spec.rb index 0d648250aeb..deef52735b3 100644 --- a/spec/system/admin/payments_stripe_spec.rb +++ b/spec/system/admin/payments_stripe_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an hub manager I want to make Stripe payments ' do diff --git a/spec/system/admin/product_import_spec.rb b/spec/system/admin/product_import_spec.rb index 6cc91970a61..21104c4fd5c 100644 --- a/spec/system/admin/product_import_spec.rb +++ b/spec/system/admin/product_import_spec.rb @@ -3,7 +3,7 @@ require 'system_helper' require 'open_food_network/permissions' -describe "Product Import" do +RSpec.describe "Product Import" do include AdminHelper include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/products_spec.rb b/spec/system/admin/products_spec.rb index 55e15a3e416..67493065229 100644 --- a/spec/system/admin/products_spec.rb +++ b/spec/system/admin/products_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe ' +RSpec.describe ' As an admin I want to set a supplier and distributor(s) for a product ' do @@ -20,12 +20,6 @@ @enterprise_fees = (0..2).map { |i| create(:enterprise_fee, enterprise: @distributors[i]) } end - context "as anonymous user" do - it "is redirected to login page when attempting to access product listing" do - expect { visit spree.admin_products_path }.not_to raise_error - end - end - describe "creating a product" do let!(:tax_category) { create(:tax_category, name: 'Test Tax Category') } @@ -690,7 +684,7 @@ end it "checks error when creating product image with unsupported format" do - unsupported_image_file_path = Rails.root + "README.md" + unsupported_image_file_path = Rails.root.join("README.md").to_s product = create(:simple_product, supplier: @supplier2) image = white_logo_file @@ -743,9 +737,6 @@ context "editing a product's variant unit scale" do let(:product) { create(:simple_product, name: 'a product', supplier: @supplier2) } - # TODO below -> assertions commented out refer to bug: - # https://github.com/openfoodfoundation/openfoodnetwork/issues/7180 - before do allow(Spree::Config).to receive(:available_units).and_return("g,lb,oz,kg,T,mL,L,kL") visit spree.edit_admin_product_path product diff --git a/spec/system/admin/products_v3/products_spec.rb b/spec/system/admin/products_v3/products_spec.rb index 7384f1c0bd1..ea4a45c7af2 100644 --- a/spec/system/admin/products_v3/products_spec.rb +++ b/spec/system/admin/products_v3/products_spec.rb @@ -2,35 +2,157 @@ require "system_helper" -describe 'As an admin, I can manage products', feature: :admin_style_v3 do +RSpec.describe 'As an enterprise user, I can manage my products', feature: :admin_style_v3 do + include AdminHelper include WebHelper include AuthenticationHelper include FileHelper + let(:producer) { create(:supplier_enterprise) } + let(:user) { create(:user, enterprises: [producer]) } + before do - login_as_admin + login_as user + end + + let(:producer_search_selector) { 'input[placeholder="Search for producers"]' } + let(:categories_search_selector) { 'input[placeholder="Search for categories"]' } + let(:tax_categories_search_selector) { 'input[placeholder="Search for tax categories"]' } + + describe "with no products" do + before { visit admin_products_url } + it "can see the new product page" do + expect(page).to have_content "Bulk Edit Products" + expect(page).to have_text "No products found" + # displays buttons to add products with the correct links + expect(page).to have_link(class: "button", text: "New Product", href: "/admin/products/new") + expect(page).to have_link(class: "button", text: "Import multiple products", + href: "/admin/products/import") + end end - it "can see the new product page" do - visit admin_products_url - expect(page).to have_content "Bulk Edit Products" + describe "column selector" do + let!(:product) { create(:simple_product) } + + before do + visit admin_products_url + end + + it "hides column and remembers saved preference" do + # Name shows by default + expect(page).to have_checked_field "Name" + expect(page).to have_selector "th", text: "Name" + expect_other_columns_visible + + # Name is hidden + ofn_drop_down("Columns").click + within ofn_drop_down("Columns") do + uncheck "Name" + end + expect(page).not_to have_selector "th", text: "Name" + expect_other_columns_visible + + # Preference saved + click_on "Save as default" + expect(page).to have_content "Column preferences saved" + refresh + + # Preference remembered + ofn_drop_down("Columns").click + within ofn_drop_down("Columns") do + expect(page).to have_unchecked_field "Name" + end + expect(page).not_to have_selector "th", text: "Name" + expect_other_columns_visible + end + + def expect_other_columns_visible + expect(page).to have_selector "th", text: "Producer" + expect(page).to have_selector "th", text: "Price" + expect(page).to have_selector "th", text: "On Hand" + end + end + + describe "listing" do + let!(:p1) { create(:product) } + let!(:p2) { create(:product) } + + before do + visit admin_products_url + end + + it "displays a list of products" do + within ".products" do + # displays table header + expect(page).to have_selector "th", text: "Name" + expect(page).to have_selector "th", text: "SKU" + expect(page).to have_selector "th", text: "Unit scale" + expect(page).to have_selector "th", text: "Unit" + expect(page).to have_selector "th", text: "Price" + expect(page).to have_selector "th", text: "On Hand" + expect(page).to have_selector "th", text: "Producer" + expect(page).to have_selector "th", text: "Category" + expect(page).to have_selector "th", text: "Tax Category" + expect(page).to have_selector "th", text: "Inherits Properties?" + expect(page).to have_selector "th", text: "Actions" + + # displays product list + expect(page).to have_selector row_containing_name(p1.name.to_s) + expect(page).to have_selector row_containing_name(p2.name.to_s) + end + end + + context "with several variants" do + let!(:variant1) { p1.variants.first } + let!(:variant2) { p2.variants.first } + let!(:variant3) { create(:variant, product: p2, on_demand: false, on_hand: 4) } + + before do + variant1.update!(on_hand: 0, on_demand: true) + variant2.update!(on_hand: 16, on_demand: false) + visit spree.admin_products_path + end + + it "displays an on hand count in a span for each product" do + expect(page).to have_content "On demand" + expect(page).not_to have_content "20" # does not display the total stock + expect(page).to have_content "16" # displays the stock for variant_2 + expect(page).to have_content "4" # displays the stock for variant_3 + end + end end describe "sorting" do let!(:product_b) { create(:simple_product, name: "Bananas") } let!(:product_a) { create(:simple_product, name: "Apples") } + let(:products_table) { "table.products" } before do visit admin_products_url end - it "Should sort products alphabetically by default" do - within "table.products" do - # Gather input values, because page.content doesn't include them. - input_content = page.find_all('input[type=text]').map(&:value).join - + it "Should sort products alphabetically by default in ascending order" do + within products_table do # Products are in correct order. - expect(input_content).to match /Apples.*Bananas/ + expect(all_input_values).to match /Apples.*Bananas/ + end + end + + context "when clicked on 'Name' column header" do + it "Should sort products alphabetically in descending/ascending order" do + within products_table do + name_header = page.find('th > a[data-column="name"]') + + # Sort in descending order + name_header.click + expect(page).to have_content("Name ▼") # this indicates the re-sorted content has loaded + expect(all_input_values).to match /Bananas.*Apples/ + + # Sort in ascending order + name_header.click + expect(page).to have_content("Name ▲") # this indicates the re-sorted content has loaded + expect(all_input_values).to match /Apples.*Bananas/ + end end end end @@ -66,11 +188,13 @@ end describe "search" do - # TODO: explicitly test with multiple products, to ensure incorrect products don't show. - # TODO: test with multiple variants, to ensure distinct query reponse context "product has searchable term" do # create a product with a name that can be searched let!(:product_by_name) { create(:simple_product, name: "searchable product") } + let!(:variant_a) { + create(:variant, product_id: product_by_name.id, display_name: "Medium box") + } + let!(:variant_b) { create(:variant, product_id: product_by_name.id, display_name: "Big box") } it "can search for a product" do create_products 1 @@ -79,7 +203,39 @@ search_for "searchable product" expect(page).to have_field "search_term", with: "searchable product" - # expect(page).to have_content "1 product found for your search criteria." + expect(page).to have_content "1 products found for your search criteria." + expect_products_count_to_be 1 + end + + it "with multiple products" do + create_products 2 + visit admin_products_url + + # returns no results, if the product does not exist + search_for "a product which does not exist" + + expect(page).to have_field "search_term", with: "a product which does not exist" + expect(page).to have_content "No products found for your search criteria" + expect_products_count_to_be 0 + + # returns the existing product + search_for "searchable product" + + expect(page).to have_field "search_term", with: "searchable product" + expect(page).to have_content "1 products found for your search criteria." + expect_products_count_to_be 1 + end + + it "can search variant names" do + create_products 1 + visit admin_products_url + + expect_products_count_to_be 2 + + search_for "Big box" + + expect(page).to have_field "search_term", with: "Big box" + expect(page).to have_content "1 products found for your search criteria." expect_products_count_to_be 1 end @@ -96,7 +252,7 @@ expect_per_page_to_be 15 expect_products_count_to_be 1 search_for "searchable product" - # expect(page).to have_content "1 product found for your search criteria." + expect(page).to have_content "1 products found for your search criteria." expect_products_count_to_be 1 end @@ -106,7 +262,7 @@ search_for "searchable product" expect(page).to have_field "search_term", with: "searchable product" - # expect(page).to have_content "1 product found for your search criteria." + expect(page).to have_content "1 products found for your search criteria." expect_products_count_to_be 1 expect(page).to have_field "Name", with: product_by_name.name @@ -129,8 +285,10 @@ before { create_products 1 } # create a product with a different supplier - let!(:producer) { create(:supplier_enterprise, name: "Producer 1") } - let!(:product_by_supplier) { create(:simple_product, name: "Apples", supplier: producer) } + let!(:producer1) { create(:supplier_enterprise, name: "Producer 1") } + let!(:product_by_supplier) { create(:simple_product, name: "Apples", supplier: producer1) } + + before { user.enterprise_roles.create(enterprise: producer1) } it "can search for and update a product" do visit admin_products_url @@ -173,13 +331,15 @@ search_by_category "Category 1" # expect(page).to have_content "1 product found for your search criteria." - expect(page).to have_select "category_id", selected: "Category 1" + expect(page).to have_select "category_id", selected: "Category 1" # fails in dev but not CI expect_products_count_to_be 1 expect(page).to have_field "Name", with: product_by_category.name end end end + describe "columns" + describe "updating" do let!(:variant_a1) { product_a.variants.first.tap{ |v| @@ -191,6 +351,16 @@ create(:simple_product, name: "Apples", sku: "APL-00", variant_unit: "weight", variant_unit_scale: 1) # Grams } + let(:variant_b1) { + product_b.variants.first.tap{ |v| + v.update! display_name: "Medium box", sku: "TMT-01", price: 5, on_hand: 5, + on_demand: false + } + } + let(:product_b) { + create(:simple_product, name: "Tomatoes", sku: "TMT-01", + variant_unit: "weight", variant_unit_scale: 1) # Grams + } before do visit admin_products_url end @@ -209,7 +379,6 @@ end # Unit popout - # TODO: prevent empty value fill_in "Unit value", with: "" click_button "Save changes" # attempt to save or close the popout expect(page).to have_field "Unit value", with: "" # popout is still open @@ -473,6 +642,15 @@ end end + describe "creating a new product" do + it "redirects to the New Product page" do + visit admin_products_url + expect { + click_link("New Product") + }.to change { current_path }.to(spree.new_admin_product_path) + end + end + describe "adding variants" do it "creates a new variant" do click_on "New variant" @@ -521,6 +699,107 @@ end end + it 'removes a newly added not persisted variant' do + click_on "New variant" + new_variant_row = find_field("Name", placeholder: "Apples", with: "").ancestor("tr") + within new_variant_row do + fill_in "Name", with: "Large box" + fill_in "SKU", with: "APL-02" + expect(page).to have_field("Name", placeholder: "Apples", with: "Large box") + end + + expect(page).to have_text("1 product modified.") + expect(page).to have_css('form.disabled-section#filters') # ie search/sort disabled + + within new_variant_row do + page.find(".vertical-ellipsis-menu").click + page.find('a', text: 'Remove').click + end + + expect(page).not_to have_field("Name", placeholder: "Apples", with: "Large box") + expect(page).not_to have_text("1 product modified.") + expect(page).not_to have_css('form.disabled-section#filters') + end + + it "removes newly added not persistent Variants one at a time" do + click_on "New variant" + + first_new_variant_row = find_field("Name", placeholder: "Apples", with: "").ancestor("tr") + within first_new_variant_row do + fill_in "Name", with: "Large box" + end + + click_on "New variant" + second_new_variant_row = find_field("Name", placeholder: "Apples", with: "").ancestor("tr") + within second_new_variant_row do + fill_in "Name", with: "Huge box" + end + + expect(page).to have_text("1 product modified.") + expect(page).to have_css('form.disabled-section#filters') + + within first_new_variant_row do + page.find(".vertical-ellipsis-menu").click + page.find('a', text: 'Remove').click + end + + expect(page).to have_text("1 product modified.") + + within second_new_variant_row do + page.find(".vertical-ellipsis-menu").click + page.find('a', text: 'Remove').click + end + # Only when all non persistent variants are gone that product is non modified + expect(page).not_to have_text("1 product modified.") + expect(page).not_to have_css('form.disabled-section#filters') + end + + context "With 2 products" do + before do + variant_b1 + # To add 2nd product on page + page.refresh + end + + it "removes newly added Variants across products" do + click_on "New variant" + apples_new_variant_row = + find_field("Name", placeholder: "Apples", with: "").ancestor("tr") + within apples_new_variant_row do + fill_in "Name", with: "Large box" + end + + tomatoes_part = page.all('tbody')[1] + within tomatoes_part do + click_on "New variant" + end + tomatoes_new_variant_row = + find_field("Name", placeholder: "Tomatoes", with: "").ancestor("tr") + within tomatoes_new_variant_row do + fill_in "Name", with: "Huge box" + end + expect(page).to have_text("2 products modified.") + expect(page).to have_css('form.disabled-section#filters') # ie search/sort disabled + + within apples_new_variant_row do + page.find(".vertical-ellipsis-menu").click + page.find('a', text: 'Remove').click + end + # New variant for apples is no more, expect only 1 modified product + expect(page).to have_text("1 product modified.") + # search/sort still disabled + expect(page).to have_css('form.disabled-section#filters') + + within tomatoes_new_variant_row do + page.find(".vertical-ellipsis-menu").click + page.find('a', text: 'Remove').click + end + # Back to page without any alteration + expect(page).not_to have_text("1 product modified.") + expect(page).not_to have_css('form.disabled-section#filters') + end + end + context "with invalid data" do before do click_on "New variant" @@ -599,6 +878,22 @@ expect(new_variant.price).to eq 10.25 expect(new_variant.unit_value).to eq 200 end + + it "removes unsaved record" do + click_button "Save changes" + + expect(page).to have_text("1 product could not be saved.") + + within row_containing_name("N" * 256) do + page.find(".vertical-ellipsis-menu").click + page.find('a', text: 'Remove').click + end + + # Now that invalid variant is removed, we can proceed to save + click_button "Save changes" + expect(page).not_to have_text("1 product could not be saved.") + expect(page).not_to have_css('form.disabled-section#filters') + end end end @@ -661,15 +956,128 @@ end end + describe "Changing producers, category and tax category" do + let!(:variant_a1) { + product_a.variants.first.tap{ |v| + v.update! display_name: "Medium box", sku: "APL-01", price: 5.25, on_hand: 5, + on_demand: false + } + } + let!(:product_a) { + create(:simple_product, name: "Apples", sku: "APL-00", + variant_unit: "weight", variant_unit_scale: 1) # Grams + } + + context "when they are under 11" do + before do + create_list(:supplier_enterprise, 9, users: [user]) + create_list(:tax_category, 9) + create_list(:taxon, 2) + + visit admin_products_url + end + + it "should not display search input, change the producers, category and tax category" do + producer_to_select = random_producer(product_a) + category_to_select = random_category(variant_a1) + tax_category_to_select = random_tax_category + + within row_containing_name(product_a.name) do + validate_tomselect_without_search!( + page, "Producer", + producer_search_selector + ) + tomselect_select(producer_to_select, from: "Producer") + end + + within row_containing_name(variant_a1.display_name) do + validate_tomselect_without_search!( + page, "Category", + categories_search_selector + ) + tomselect_select(category_to_select, from: "Category") + + validate_tomselect_without_search!( + page, "Tax Category", + tax_categories_search_selector + ) + tomselect_select(tax_category_to_select, from: "Tax Category") + end + + click_button "Save changes" + + expect(page).to have_content "Changes saved" + product_a.reload + variant_a1.reload + + expect(product_a.supplier.name).to eq(producer_to_select) + expect(variant_a1.primary_taxon.name).to eq(category_to_select) + expect(variant_a1.tax_category.name).to eq(tax_category_to_select) + end + end + + context "when they are over 11" do + before do + create_list(:supplier_enterprise, 11, users: [user]) + create_list(:tax_category, 11) + create_list(:taxon, 11) + + visit admin_products_url + end + + it "should display search input, change the producer" do + producer_to_select = random_producer(product_a) + category_to_select = random_category(variant_a1) + tax_category_to_select = random_tax_category + + within row_containing_name(product_a.name) do + validate_tomselect_with_search!( + page, "Producer", + producer_search_selector + ) + tomselect_search_and_select(producer_to_select, from: "Producer") + end + + within row_containing_name(variant_a1.display_name) do + sleep(0.1) + validate_tomselect_with_search!( + page, "Category", + categories_search_selector + ) + tomselect_search_and_select(category_to_select, from: "Category") + + sleep(0.1) + validate_tomselect_with_search!( + page, "Tax Category", + tax_categories_search_selector + ) + tomselect_search_and_select(tax_category_to_select, from: "Tax Category") + end + + click_button "Save changes" + + expect(page).to have_content "Changes saved" + product_a.reload + variant_a1.reload + + expect(product_a.supplier.name).to eq(producer_to_select) + expect(variant_a1.primary_taxon.name).to eq(category_to_select) + expect(variant_a1.tax_category.name).to eq(tax_category_to_select) + end + end + end + describe "edit image" do shared_examples "updating image" do - it "saves product image" do + before do visit admin_products_url within row_containing_name("Apples") do click_on "Edit" end + end + it "saves product image" do within ".reveal-modal" do expect(page).to have_content "Edit product photo" expect_page_to_have_image(current_img_url) @@ -686,6 +1094,25 @@ expect_page_to_have_image('500.jpg') end end + + it 'shows a modal telling not a valid image when uploading wrong type of file' do + within ".reveal-modal" do + attach_file 'image[attachment]', + Rails.public_path.join('Terms-of-service.pdf'), + visible: false + expect(page).to have_content /Attachment is not a valid image/ + expect(page).to have_content /Attachment has an invalid content type/ + end + end + + it 'shows a modal telling not a valid image when uploading a non valid image file' do + within ".reveal-modal" do + attach_file 'image[attachment]', + Rails.public_path.join('invalid_image.jpg'), + visible: false + expect(page).to have_content /Attachment is not a valid image/ + end + end end context "with existing image" do @@ -901,8 +1328,6 @@ end expect(page).not_to have_selector(modal_selector) - # Make sure the products loading spinner is hidden - wait_for_class('.spinner-overlay', 'hidden') expect(page).not_to have_selector(variant_selector) within success_flash_message_selector do expect(page).to have_content("Successfully deleted the variant") @@ -919,8 +1344,6 @@ page.find(delete_button_selector).click end expect(page).not_to have_selector(modal_selector) - # Make sure the products loading spinner is hidden - wait_for_class('.spinner-overlay', 'hidden') expect(page).not_to have_selector(product_selector) within success_flash_message_selector do expect(page).to have_content("Successfully deleted the product") @@ -943,9 +1366,6 @@ page.find(delete_button_selector).click end - expect(page).not_to have_selector(modal_selector) - sleep(0.5) # delay for loading spinner to complete - expect(page).to have_selector(variant_selector) within error_flash_message_selector do expect(page).to have_content("Unable to delete the variant") page.find(dismiss_button_selector).click @@ -960,21 +1380,128 @@ within modal_selector do page.find(delete_button_selector).click end - expect(page).not_to have_selector(modal_selector) - sleep(0.5) # delay for loading spinner to complete - expect(page).to have_selector(product_selector) within error_flash_message_selector do expect(page).to have_content("Unable to delete the product") end end end + + context 'a shipped product' do + let!(:order) { create(:shipped_order, line_items_count: 1) } + let!(:line_item) { order.reload.line_items.first } + + context "a deleted line item from a shipped order" do + before do + login_as_admin + visit admin_products_url + + # Delete Variant + within variant_selector do + page.find(".vertical-ellipsis-menu").click + page.find(delete_option_selector).click + end + + delete_button_selector = "input[type=button][value='Delete variant']" + within modal_selector do + page.find(delete_button_selector).click + end + end + + it 'keeps the line item on the order (admin)' do + visit spree.edit_admin_order_path(order) + + expect(page).to have_content(line_item.product.name.to_s) + end + end + end end end end + context "as an enterprise manager" do + let(:supplier_managed1) { create(:supplier_enterprise, name: 'Supplier Managed 1') } + let(:supplier_managed2) { create(:supplier_enterprise, name: 'Supplier Managed 2') } + let(:supplier_unmanaged) { create(:supplier_enterprise, name: 'Supplier Unmanaged') } + let(:supplier_permitted) { create(:supplier_enterprise, name: 'Supplier Permitted') } + let(:distributor_managed) { create(:distributor_enterprise, name: 'Distributor Managed') } + let(:distributor_unmanaged) { create(:distributor_enterprise, name: 'Distributor Unmanaged') } + let!(:product_supplied) { create(:product, supplier: supplier_managed1, price: 10.0) } + let!(:product_not_supplied) { create(:product, supplier: supplier_unmanaged) } + let!(:product_supplied_permitted) { + create(:product, name: 'Product Permitted', supplier: supplier_permitted, price: 10.0) + } + let(:product_supplied_inactive) { + create(:product, supplier: supplier_managed1, price: 10.0) + } + + let!(:supplier_permitted_relationship) do + create(:enterprise_relationship, parent: supplier_permitted, child: supplier_managed1, + permissions_list: [:manage_products]) + end + + before do + enterprise_user = create(:user) + enterprise_user.enterprise_roles.build(enterprise: supplier_managed1).save + enterprise_user.enterprise_roles.build(enterprise: supplier_managed2).save + enterprise_user.enterprise_roles.build(enterprise: distributor_managed).save + + login_as enterprise_user + end + + it "shows only products that I supply" do + visit spree.admin_products_path + + # displays permitted product list only + expect(page).to have_selector row_containing_name(product_supplied.name) + expect(page).to have_selector row_containing_name(product_supplied_permitted.name) + expect(page).not_to have_selector row_containing_name(product_not_supplied.name) + end + + it "shows only suppliers that I manage or have permission to" do + visit spree.admin_products_path + within row_containing_name(product_supplied.name) do + expect(page).to have_select( + '_products_0_supplier_id', + options: [ + supplier_managed1.name, supplier_managed2.name, supplier_permitted.name + ], selected: supplier_managed1.name + ) + end + + within row_containing_name(product_supplied_permitted.name) do + expect(page).to have_select( + '_products_1_supplier_id', + options: [ + supplier_managed1.name, supplier_managed2.name, supplier_permitted.name + ], selected: supplier_permitted.name + ) + end + end + + it "shows inactive products that I supply" do + product_supplied_inactive + + visit spree.admin_products_path + + expect(page).to have_selector row_containing_name(product_supplied_inactive.name) + end + + it "allows me to update a product" do + visit spree.admin_products_path + + within row_containing_name(product_supplied.name) do + fill_in "Name", with: "Pommes" + end + click_button "Save changes" + + expect(page).to have_content "Changes saved" + expect(page).to have_selector row_containing_name("Pommes") + end + end + def create_products(amount) amount.times do |i| - create(:simple_product, name: "product #{i}") + create(:simple_product, name: "product #{i}", supplier: producer) end end @@ -1025,6 +1552,39 @@ def expect_page_to_have_image(url) end def tax_category_column - @tax_category_column ||= 'td:nth-child(10)' + @tax_category_column ||= '[data-controller="variant"] > td:nth-child(10)' + end + + def validate_tomselect_without_search!(page, field_name, search_selector) + open_tomselect_to_validate!(page, field_name) do + expect(page).not_to have_selector(search_selector) + end + end + + def validate_tomselect_with_search!(page, field_name, search_selector) + open_tomselect_to_validate!(page, field_name) do + expect(page).to have_selector(search_selector) + end + end + + def random_producer(product) + Enterprise.is_primary_producer + .where.not(id: product.supplier.id) + .pluck(:name).sample + end + + def random_category(variant) + Spree::Taxon + .where.not(id: variant.primary_taxon.id) + .pluck(:name).sample + end + + def random_tax_category + Spree::TaxCategory + .pluck(:name).sample + end + + def all_input_values + page.find_all('input[type=text]').map(&:value).join end end diff --git a/spec/system/admin/properties_spec.rb b/spec/system/admin/properties_spec.rb index 21ca9ff9194..fe3c2d2e508 100644 --- a/spec/system/admin/properties_spec.rb +++ b/spec/system/admin/properties_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe ' +RSpec.describe ' As an admin I want to manage product properties ' do diff --git a/spec/system/admin/reports/enterprise_fee_summaries_spec.rb b/spec/system/admin/reports/enterprise_fee_summaries_spec.rb index 5e44a321ab2..4d1b70fee73 100644 --- a/spec/system/admin/reports/enterprise_fee_summaries_spec.rb +++ b/spec/system/admin/reports/enterprise_fee_summaries_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "enterprise fee summaries" do +RSpec.describe "enterprise fee summaries" do include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/reports/enterprise_summary_fees/enterprise_summary_fee_with_tax_report_by_order_spec.rb b/spec/system/admin/reports/enterprise_summary_fees/enterprise_summary_fee_with_tax_report_by_order_spec.rb index bd833db5d8b..fb80e2b510a 100644 --- a/spec/system/admin/reports/enterprise_summary_fees/enterprise_summary_fee_with_tax_report_by_order_spec.rb +++ b/spec/system/admin/reports/enterprise_summary_fees/enterprise_summary_fee_with_tax_report_by_order_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Enterprise Summary Fee with Tax Report By Order" do +RSpec.describe "Enterprise Summary Fee with Tax Report By Order" do # 1 order cycle the has: # - coordinator fees price 20 # - incoming exchange fees 15 diff --git a/spec/system/admin/reports/enterprise_summary_fees/enterprise_summary_fee_with_tax_report_by_producer_spec.rb b/spec/system/admin/reports/enterprise_summary_fees/enterprise_summary_fee_with_tax_report_by_producer_spec.rb index d31796eea44..bdab8ac972e 100644 --- a/spec/system/admin/reports/enterprise_summary_fees/enterprise_summary_fee_with_tax_report_by_producer_spec.rb +++ b/spec/system/admin/reports/enterprise_summary_fees/enterprise_summary_fee_with_tax_report_by_producer_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Enterprise Summary Fee with Tax Report By Producer" do +RSpec.describe "Enterprise Summary Fee with Tax Report By Producer" do # 1 order cycle has: # - coordinator fees price 20 # - incoming exchange fees 15 diff --git a/spec/system/admin/reports/orders_and_fulfillment_spec.rb b/spec/system/admin/reports/orders_and_fulfillment_spec.rb index f96ddf89d5b..971484492ae 100644 --- a/spec/system/admin/reports/orders_and_fulfillment_spec.rb +++ b/spec/system/admin/reports/orders_and_fulfillment_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "Orders And Fulfillment" do +RSpec.describe "Orders And Fulfillment" do include AuthenticationHelper include WebHelper @@ -125,8 +125,9 @@ it "is precise to time of day, not just date" do # When I generate a customer report # with a timeframe that includes one order but not the other - pick_datetime "#q_completed_at_gt", datetime_start1 - pick_datetime "#q_completed_at_lt", datetime_end + find("input.datepicker").click + select_dates_from_daterangepicker datetime_start1, datetime_end + find(".shortcut-buttons-flatpickr-button").click # closes flatpickr find("#display_summary_row").set(false) # hides the summary rows run_report @@ -141,7 +142,8 @@ # 2 rows for order1 + 1 summary row # setting a time interval to include both orders - pick_datetime "#q_completed_at_gt", datetime_start2 + find("input.datepicker").click + select_dates_from_daterangepicker datetime_start2, Time.zone.now run_report # Then I should see the rows for both orders expect(all('table.report__table tbody tr').count).to eq(5) diff --git a/spec/system/admin/reports/packing_report_spec.rb b/spec/system/admin/reports/packing_report_spec.rb index f1117e5dee8..04f2f82a499 100644 --- a/spec/system/admin/reports/packing_report_spec.rb +++ b/spec/system/admin/reports/packing_report_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "Packing Reports" do +RSpec.describe "Packing Reports" do include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/reports/payments_report_spec.rb b/spec/system/admin/reports/payments_report_spec.rb index 762d3a5215b..ad220e6accf 100644 --- a/spec/system/admin/reports/payments_report_spec.rb +++ b/spec/system/admin/reports/payments_report_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Payments Reports" do +RSpec.describe "Payments Reports" do include AuthenticationHelper let(:order) do diff --git a/spec/system/admin/reports/revenues_by_hub_spec.rb b/spec/system/admin/reports/revenues_by_hub_spec.rb index 8d950901cb6..71ce4386c9a 100644 --- a/spec/system/admin/reports/revenues_by_hub_spec.rb +++ b/spec/system/admin/reports/revenues_by_hub_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Revenues By Hub Reports" do +RSpec.describe "Revenues By Hub Reports" do include AuthenticationHelper let(:order) do diff --git a/spec/system/admin/reports/sales_tax/sales_tax_totals_by_order_spec.rb b/spec/system/admin/reports/sales_tax/sales_tax_totals_by_order_spec.rb index 1ff6b557b04..b1861826692 100644 --- a/spec/system/admin/reports/sales_tax/sales_tax_totals_by_order_spec.rb +++ b/spec/system/admin/reports/sales_tax/sales_tax_totals_by_order_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Sales Tax Totals By order" do +RSpec.describe "Sales Tax Totals By order" do # Scenarion 1: added tax # 1 producer # 1 distributor diff --git a/spec/system/admin/reports/sales_tax/sales_tax_totals_by_producer_spec.rb b/spec/system/admin/reports/sales_tax/sales_tax_totals_by_producer_spec.rb index da3244cef59..e896d23a147 100644 --- a/spec/system/admin/reports/sales_tax/sales_tax_totals_by_producer_spec.rb +++ b/spec/system/admin/reports/sales_tax/sales_tax_totals_by_producer_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Sales Tax Totals By Producer" do +RSpec.describe "Sales Tax Totals By Producer" do # Scenario 1: added tax # 1 producer # 1 distributor diff --git a/spec/system/admin/reports/users_and_enterprises_spec.rb b/spec/system/admin/reports/users_and_enterprises_spec.rb index e54c1c8e32d..64ad6c04e7e 100644 --- a/spec/system/admin/reports/users_and_enterprises_spec.rb +++ b/spec/system/admin/reports/users_and_enterprises_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Users & Enterprises reports" do +RSpec.describe "Users & Enterprises reports" do include AuthenticationHelper before do diff --git a/spec/system/admin/reports_spec.rb b/spec/system/admin/reports_spec.rb index abe26647c7e..a8de1463289 100644 --- a/spec/system/admin/reports_spec.rb +++ b/spec/system/admin/reports_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe ' +RSpec.describe ' As an administrator I want numbers, all the numbers! ' do diff --git a/spec/system/admin/schedules_spec.rb b/spec/system/admin/schedules_spec.rb index 8832f34d660..383e26d931c 100644 --- a/spec/system/admin/schedules_spec.rb +++ b/spec/system/admin/schedules_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Schedules' do +RSpec.describe 'Schedules' do include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/shipping_methods_spec.rb b/spec/system/admin/shipping_methods_spec.rb index 2bcc1f142cf..6a4e7abad70 100644 --- a/spec/system/admin/shipping_methods_spec.rb +++ b/spec/system/admin/shipping_methods_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'shipping methods' do +RSpec.describe 'shipping methods' do include WebHelper include AuthenticationHelper diff --git a/spec/system/admin/subscriptions/crud_spec.rb b/spec/system/admin/subscriptions/crud_spec.rb index 8882defc206..91e94672169 100644 --- a/spec/system/admin/subscriptions/crud_spec.rb +++ b/spec/system/admin/subscriptions/crud_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Subscriptions' do +RSpec.describe 'Subscriptions' do include AdminHelper include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/subscriptions/smoke_tests_spec.rb b/spec/system/admin/subscriptions/smoke_tests_spec.rb index 348721ac33a..feb905a1aa9 100644 --- a/spec/system/admin/subscriptions/smoke_tests_spec.rb +++ b/spec/system/admin/subscriptions/smoke_tests_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Subscriptions' do +RSpec.describe 'Subscriptions' do include AdminHelper include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/tag_rules_spec.rb b/spec/system/admin/tag_rules_spec.rb index 72603632a68..f369fcc94d3 100644 --- a/spec/system/admin/tag_rules_spec.rb +++ b/spec/system/admin/tag_rules_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Tag Rules' do +RSpec.describe 'Tag Rules' do include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/tax_settings_spec.rb b/spec/system/admin/tax_settings_spec.rb index 5a7392626e8..7b84c5d960d 100644 --- a/spec/system/admin/tax_settings_spec.rb +++ b/spec/system/admin/tax_settings_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Account and Billing Settings' do +RSpec.describe 'Account and Billing Settings' do include AuthenticationHelper include WebHelper diff --git a/spec/system/admin/tos_banner_spec.rb b/spec/system/admin/tos_banner_spec.rb index 8fe256558bb..867af24faea 100644 --- a/spec/system/admin/tos_banner_spec.rb +++ b/spec/system/admin/tos_banner_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Terms of Service banner' do +RSpec.describe 'Terms of Service banner' do include AuthenticationHelper include FileHelper diff --git a/spec/system/admin/unit_price_spec.rb b/spec/system/admin/unit_price_spec.rb index 31070ac4212..3c82f76c400 100644 --- a/spec/system/admin/unit_price_spec.rb +++ b/spec/system/admin/unit_price_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an admin I want to check the unit price of my products/variants ' do diff --git a/spec/system/admin/users_spec.rb b/spec/system/admin/users_spec.rb index 5d3a6f90460..6548dbc5586 100644 --- a/spec/system/admin/users_spec.rb +++ b/spec/system/admin/users_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "Managing users" do +RSpec.describe "Managing users" do include AuthenticationHelper context "as super-admin" do diff --git a/spec/system/admin/variant_overrides_spec.rb b/spec/system/admin/variant_overrides_spec.rb index 2da4bf705a3..9e5554bc92c 100644 --- a/spec/system/admin/variant_overrides_spec.rb +++ b/spec/system/admin/variant_overrides_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe " +RSpec.describe " Managing a hub's inventory I want to override the stock level and price of products Without affecting other hubs that share the same products diff --git a/spec/system/admin/variants_spec.rb b/spec/system/admin/variants_spec.rb index 754670b542e..beb164fe1ea 100644 --- a/spec/system/admin/variants_spec.rb +++ b/spec/system/admin/variants_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an admin I want to manage product variants ' do diff --git a/spec/system/admin/vouchers_spec.rb b/spec/system/admin/vouchers_spec.rb index c6893de80fb..2673cb24037 100644 --- a/spec/system/admin/vouchers_spec.rb +++ b/spec/system/admin/vouchers_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As an entreprise user I want to manage vouchers ' do diff --git a/spec/system/consumer/account/cards_spec.rb b/spec/system/consumer/account/cards_spec.rb index a4228031b6f..58764598c97 100644 --- a/spec/system/consumer/account/cards_spec.rb +++ b/spec/system/consumer/account/cards_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Credit Cards" do +RSpec.describe "Credit Cards" do include AuthenticationHelper include StripeHelper include StripeStubs diff --git a/spec/system/consumer/account/developer_settings_spec.rb b/spec/system/consumer/account/developer_settings_spec.rb index 704a4a986e0..06b204d7629 100644 --- a/spec/system/consumer/account/developer_settings_spec.rb +++ b/spec/system/consumer/account/developer_settings_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "Developer Settings" do +RSpec.describe "Developer Settings" do include AuthenticationHelper include WebHelper diff --git a/spec/system/consumer/account/payments_spec.rb b/spec/system/consumer/account/payments_spec.rb index b88a3932f59..0efbf46c134 100644 --- a/spec/system/consumer/account/payments_spec.rb +++ b/spec/system/consumer/account/payments_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Payments requiring action" do +RSpec.describe "Payments requiring action" do include AuthenticationHelper describe "as a logged in user" do diff --git a/spec/system/consumer/account/settings_spec.rb b/spec/system/consumer/account/settings_spec.rb index d20e870db95..58a49c2b2d3 100644 --- a/spec/system/consumer/account/settings_spec.rb +++ b/spec/system/consumer/account/settings_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Account Settings" do +RSpec.describe "Account Settings" do include AuthenticationHelper describe "as a logged in user" do diff --git a/spec/system/consumer/account_spec.rb b/spec/system/consumer/account_spec.rb index d50ced38a0e..ed984f3452a 100644 --- a/spec/system/consumer/account_spec.rb +++ b/spec/system/consumer/account_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As a consumer I want to view my order history with each hub and view any outstanding balance. diff --git a/spec/system/consumer/authentication_spec.rb b/spec/system/consumer/authentication_spec.rb index 7062d99a2e4..196425e9d5b 100644 --- a/spec/system/consumer/authentication_spec.rb +++ b/spec/system/consumer/authentication_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Authentication" do +RSpec.describe "Authentication" do include AuthenticationHelper include UIComponentHelper diff --git a/spec/system/consumer/caching/darkswarm_caching_spec.rb b/spec/system/consumer/caching/darkswarm_caching_spec.rb index eea29f8cb2a..02c2fdad651 100644 --- a/spec/system/consumer/caching/darkswarm_caching_spec.rb +++ b/spec/system/consumer/caching/darkswarm_caching_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "Darkswarm data caching", caching: true do +RSpec.describe "Darkswarm data caching", caching: true do let!(:taxon) { create(:taxon, name: "Cached Taxon") } let!(:property) { create(:property, presentation: "Cached Property") } diff --git a/spec/system/consumer/caching/shops_caching_spec.rb b/spec/system/consumer/caching/shops_caching_spec.rb index b44a8f77bcf..baaf3302e30 100644 --- a/spec/system/consumer/caching/shops_caching_spec.rb +++ b/spec/system/consumer/caching/shops_caching_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "Shops caching", caching: true do +RSpec.describe "Shops caching", caching: true do include WebHelper include UIComponentHelper diff --git a/spec/system/consumer/checkout/details_spec.rb b/spec/system/consumer/checkout/details_spec.rb index 6f835761558..7c970196be1 100644 --- a/spec/system/consumer/checkout/details_spec.rb +++ b/spec/system/consumer/checkout/details_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "As a consumer, I want to checkout my order" do +RSpec.describe "As a consumer, I want to checkout my order" do include ShopWorkflow include CheckoutHelper include FileHelper diff --git a/spec/system/consumer/checkout/guest_spec.rb b/spec/system/consumer/checkout/guest_spec.rb index 9b5687ef088..bf24547115a 100644 --- a/spec/system/consumer/checkout/guest_spec.rb +++ b/spec/system/consumer/checkout/guest_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "As a consumer, I want to checkout my order" do +RSpec.describe "As a consumer, I want to checkout my order" do include ShopWorkflow include CheckoutHelper include FileHelper @@ -292,4 +292,30 @@ end end end + + shared_examples "when a line item is out of stock" do |session, step| + context "as a #{session} user" do + let(:user) { create(:user) } + before do + variant.on_demand = false + variant.on_hand = 0 + variant.save! + + if session == "logged" + login_as(user) + end + end + it "returns me to the cart with an error message" do + out_of_stock_check(step) + end + end + end + + it_behaves_like "when a line item is out of stock", "guest", "details" + it_behaves_like "when a line item is out of stock", "guest", "payment" + it_behaves_like "when a line item is out of stock", "guest", "summary" + + it_behaves_like "when a line item is out of stock", "logged", "details" + it_behaves_like "when a line item is out of stock", "logged", "payment" + it_behaves_like "when a line item is out of stock", "logged", "summary" end diff --git a/spec/system/consumer/checkout/payment_spec.rb b/spec/system/consumer/checkout/payment_spec.rb index 0646e40185d..e9a1c836097 100644 --- a/spec/system/consumer/checkout/payment_spec.rb +++ b/spec/system/consumer/checkout/payment_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "As a consumer, I want to checkout my order" do +RSpec.describe "As a consumer, I want to checkout my order" do include ShopWorkflow include CheckoutHelper include FileHelper diff --git a/spec/system/consumer/checkout/summary_spec.rb b/spec/system/consumer/checkout/summary_spec.rb index 1b277197174..75a1a06487e 100644 --- a/spec/system/consumer/checkout/summary_spec.rb +++ b/spec/system/consumer/checkout/summary_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "As a consumer, I want to checkout my order" do +RSpec.describe "As a consumer, I want to checkout my order" do include ShopWorkflow include CheckoutHelper include FileHelper diff --git a/spec/system/consumer/checkout/tax_incl_spec.rb b/spec/system/consumer/checkout/tax_incl_spec.rb index e0d1713a1d5..b8b9ff5b7ed 100644 --- a/spec/system/consumer/checkout/tax_incl_spec.rb +++ b/spec/system/consumer/checkout/tax_incl_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "As a consumer, I want to see adjustment breakdown" do +RSpec.describe "As a consumer, I want to see adjustment breakdown" do include ShopWorkflow include CheckoutHelper include CheckoutRequestsHelper diff --git a/spec/system/consumer/checkout/tax_not_incl_spec.rb b/spec/system/consumer/checkout/tax_not_incl_spec.rb index aa746adad64..274480300ed 100644 --- a/spec/system/consumer/checkout/tax_not_incl_spec.rb +++ b/spec/system/consumer/checkout/tax_not_incl_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "As a consumer, I want to see adjustment breakdown" do +RSpec.describe "As a consumer, I want to see adjustment breakdown" do include ShopWorkflow include CheckoutHelper include CheckoutRequestsHelper diff --git a/spec/system/consumer/cookies_spec.rb b/spec/system/consumer/cookies_spec.rb index 7685ab1cfa6..e97d9009739 100644 --- a/spec/system/consumer/cookies_spec.rb +++ b/spec/system/consumer/cookies_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Cookies", caching: true do +RSpec.describe "Cookies", caching: true do describe "banner" do # keeps banner toggle config unchanged around do |example| diff --git a/spec/system/consumer/footer_links_spec.rb b/spec/system/consumer/footer_links_spec.rb index af61a4bba93..b686779e827 100644 --- a/spec/system/consumer/footer_links_spec.rb +++ b/spec/system/consumer/footer_links_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Footer Links" do +RSpec.describe "Footer Links" do describe "policy link" do it "showing" do visit root_path diff --git a/spec/system/consumer/groups_spec.rb b/spec/system/consumer/groups_spec.rb index 93734d88dbf..6820ad1b9cf 100644 --- a/spec/system/consumer/groups_spec.rb +++ b/spec/system/consumer/groups_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Groups' do +RSpec.describe 'Groups' do include AuthenticationHelper include UIComponentHelper diff --git a/spec/system/consumer/multilingual_spec.rb b/spec/system/consumer/multilingual_spec.rb index 48edc6e6858..7116c0c1dee 100644 --- a/spec/system/consumer/multilingual_spec.rb +++ b/spec/system/consumer/multilingual_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Multilingual' do +RSpec.describe 'Multilingual' do include AuthenticationHelper include WebHelper include ShopWorkflow @@ -61,6 +61,13 @@ expect_menu_and_cookie_in_es expect(page).to have_content 'Precio' end + + it "visiting checkout as a guest user" do + visit checkout_path(locale: 'es') + + expect_menu_and_cookie_in_es + expect(page).to have_content 'Iniciar sesión' + end end end @@ -80,6 +87,7 @@ it 'updates user locale and stays in cookie after logout' do login_as user + visit root_path(locale: 'es') user.reload @@ -90,6 +98,57 @@ expect_menu_and_cookie_in_es expect(page).to have_content '¿Estás interesada en entrar en Open Food Network?' end + + context "visiting checkout as logged user" do + let!(:zone) { create(:zone_with_member) } + let(:supplier) { create(:supplier_enterprise) } + let(:distributor) { create(:distributor_enterprise, charges_sales_tax: true) } + let(:product) { + create(:taxed_product, supplier:, price: 10, zone:) + } + let(:variant) { product.variants.first } + let!(:order_cycle) { + create(:simple_order_cycle, suppliers: [supplier], distributors: [distributor], + coordinator: create(:distributor_enterprise), + variants: [variant]) + } + + let(:free_shipping) { + create(:shipping_method, require_ship_address: false) + } + let!(:payment) { + create(:payment_method, distributors: [distributor], + name: "Payment") + } + let(:order) { + create(:order_ready_for_confirmation, distributor:) + } + before do + set_order order + login_as user + end + + it "on the details step" do + visit checkout_step_path(:details, locale: 'es') + + expect_menu_and_cookie_in_es + expect(page).to have_content "Sus detalles" + end + + it "on the payment step" do + visit checkout_step_path(:payment, locale: 'es') + + expect_menu_and_cookie_in_es + expect(page).to have_content "Puede revisar y confirmar su pedido" + end + + it "on the summary step" do + visit checkout_step_path(:summary, locale: 'es') + + expect_menu_and_cookie_in_es + expect(page).to have_content "Detalles de entrega" + end + end end describe "using the language switcher UI" do diff --git a/spec/system/consumer/producers_spec.rb b/spec/system/consumer/producers_spec.rb index 36ccd65a476..48832fbd620 100644 --- a/spec/system/consumer/producers_spec.rb +++ b/spec/system/consumer/producers_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe ' +RSpec.describe ' As a consumer I want to see a list of producers So that I can shop at hubs distributing their products diff --git a/spec/system/consumer/registration_spec.rb b/spec/system/consumer/registration_spec.rb index e95c69812af..ad37f4a8c10 100644 --- a/spec/system/consumer/registration_spec.rb +++ b/spec/system/consumer/registration_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Registration" do +RSpec.describe "Registration" do include AuthenticationHelper include WebHelper diff --git a/spec/system/consumer/shopping/cart_spec.rb b/spec/system/consumer/shopping/cart_spec.rb index 3cd4150e2a4..5ad9edef83b 100644 --- a/spec/system/consumer/shopping/cart_spec.rb +++ b/spec/system/consumer/shopping/cart_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "full-page cart" do +RSpec.describe "full-page cart" do include AuthenticationHelper include WebHelper include ShopWorkflow diff --git a/spec/system/consumer/shopping/checkout_auth_spec.rb b/spec/system/consumer/shopping/checkout_auth_spec.rb index 0b12d7ff0db..0e3ea887f7b 100644 --- a/spec/system/consumer/shopping/checkout_auth_spec.rb +++ b/spec/system/consumer/shopping/checkout_auth_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "As a consumer I want to check out my cart" do +RSpec.describe "As a consumer I want to check out my cart" do include AuthenticationHelper include WebHelper include ShopWorkflow diff --git a/spec/system/consumer/shopping/checkout_paypal_spec.rb b/spec/system/consumer/shopping/checkout_paypal_spec.rb index aea78073249..8368867e2c0 100644 --- a/spec/system/consumer/shopping/checkout_paypal_spec.rb +++ b/spec/system/consumer/shopping/checkout_paypal_spec.rb @@ -2,11 +2,11 @@ require "system_helper" -describe "Check out with Paypal" do +RSpec.describe "Check out with Paypal" do include ShopWorkflow - include CheckoutRequestsHelper include AuthenticationHelper include PaypalHelper + include CheckoutHelper let(:distributor) { create(:distributor_enterprise) } let(:supplier) { create(:supplier_enterprise) } @@ -47,10 +47,12 @@ end shared_examples "checking out with paypal" do |user_type| - pending user_type.to_s do + context user_type.to_s do before do fill_out_details - fill_out_form(free_shipping.name, paypal.name, save_default_addresses: false) + fill_out_billing_address + proceed_to_payment + proceed_to_summary end it "completes the checkout after successful Paypal payment" do @@ -65,7 +67,7 @@ ) stub_paypal_confirm - place_order + click_on "Complete order" expect(page).to have_content "Your order has been processed successfully" expect(order.reload.state).to eq "complete" @@ -75,14 +77,14 @@ it "fails with an error message" do stub_paypal_response success: false - place_order + click_on "Complete order" expect(page).to have_content "PayPal failed." end end end describe "shared_examples" do - pending "as a guest user" do + context "as a guest user" do before do visit checkout_path checkout_as_guest @@ -90,7 +92,7 @@ it_behaves_like "checking out with paypal", "as guest" end - pending "as a logged in user" do + context "as a logged in user" do before do login_as user visit checkout_path diff --git a/spec/system/consumer/shopping/checkout_spec.rb b/spec/system/consumer/shopping/checkout_spec.rb deleted file mode 100644 index 8c12d8c91c0..00000000000 --- a/spec/system/consumer/shopping/checkout_spec.rb +++ /dev/null @@ -1,598 +0,0 @@ -# frozen_string_literal: true - -require 'system_helper' - -describe "As a consumer I want to check out my cart" do - include AuthenticationHelper - include ShopWorkflow - include CheckoutRequestsHelper - include FileHelper - include WebHelper - include UIComponentHelper - - let!(:zone) { create(:zone_with_member) } - let(:distributor) { create(:distributor_enterprise, charges_sales_tax: true) } - let(:supplier) { create(:supplier_enterprise) } - let!(:order_cycle) { - create(:simple_order_cycle, suppliers: [supplier], distributors: [distributor], - coordinator: create(:distributor_enterprise), variants: [variant]) - } - let(:enterprise_fee) { create(:enterprise_fee, amount: 1.23, tax_category: fee_tax_category) } - let(:fee_tax_rate) { create(:tax_rate, amount: 0.10, zone:, included_in_price: true) } - let(:fee_tax_category) { create(:tax_category, tax_rates: [fee_tax_rate]) } - let(:product) { - create(:taxed_product, supplier:, price: 10, zone:, tax_rate_amount: 0.1, - included_in_price: true) - } - let(:variant) { product.variants.first } - let(:order) { - create(:order, order_cycle:, distributor:, bill_address_id: nil, - ship_address_id: nil) - } - let(:shipping_tax_rate) { create(:tax_rate, amount: 0.25, zone:, included_in_price: true) } - let(:shipping_tax_category) { create(:tax_category, tax_rates: [shipping_tax_rate]) } - - let(:free_shipping) { - create(:shipping_method, require_ship_address: true, name: "Frogs", description: "yellow", - calculator: Calculator::FlatRate.new(preferred_amount: 0.00)) - } - let(:shipping_with_fee) { - create(:shipping_method, require_ship_address: false, tax_category: shipping_tax_category, - name: "Donkeys", description: "blue", - calculator: Calculator::FlatRate.new(preferred_amount: 4.56)) - } - let(:tagged_shipping) { - create(:shipping_method, require_ship_address: false, name: "Local", tag_list: "local") - } - let!(:check_without_fee) { - create(:payment_method, distributors: [distributor], name: "Roger rabbit", - type: "Spree::PaymentMethod::Check") - } - let!(:check_with_fee) { - create(:payment_method, distributors: [distributor], - calculator: Calculator::FlatRate.new(preferred_amount: 5.67)) - } - let!(:paypal) do - Spree::Gateway::PayPalExpress.create!(name: "Paypal", environment: 'test', - distributor_ids: [distributor.id]).tap do |pm| - pm.preferred_login = 'devnull-facilitator_api1.rohanmitchell.com' - pm.preferred_password = '1406163716' - pm.preferred_signature = 'AFcWxV21C7fd0v3bYYYRCpSSRl31AaTntNJ-AjvUJkWf4dgJIvcLsf1V' - end - end - - before do - add_enterprise_fee enterprise_fee - set_order order - add_product_to_cart order, product - - distributor.shipping_methods << free_shipping - distributor.shipping_methods << shipping_with_fee - distributor.shipping_methods << tagged_shipping - end - - pending "when I have an out of stock product in my cart" do - before do - variant.on_demand = false - variant.on_hand = 0 - variant.save! - end - - it "returns me to the cart with an error message" do - visit checkout_path - - expect(page).not_to have_selector 'closing', text: "Checkout now" - expect(page).to have_selector 'closing', text: "Your shopping cart" - expect(page).to have_content "An item in your cart has become unavailable" - end - end - - pending 'login in as user' do - let(:user) { create(:user) } - let(:pdf_upload) { terms_pdf_file } - - before do - login_as(user) - end - - context "with details filled out" do - before do - visit checkout_path - fill_out_form(free_shipping.name, check_without_fee.name) - end - - it "creates a new default billing address and shipping address" do - expect(user.bill_address).to be_nil - expect(user.ship_address).to be_nil - - expect(order.bill_address).to be_nil - expect(order.ship_address).to be_nil - - place_order - expect(page).to have_content "Your order has been processed successfully" - - expect(order.reload.bill_address.address1).to eq '123 Your Head' - expect(order.reload.ship_address.address1).to eq '123 Your Head' - - expect(order.customer.bill_address.address1).to eq '123 Your Head' - expect(order.customer.ship_address.address1).to eq '123 Your Head' - - expect(user.reload.bill_address.address1).to eq '123 Your Head' - expect(user.reload.ship_address.address1).to eq '123 Your Head' - end - - context "when the user and customer have existing default addresses" do - let(:existing_address) { create(:address) } - - before do - user.bill_address = existing_address - user.ship_address = existing_address - end - - it "updates billing address and shipping address" do - expect(order.bill_address).to be_nil - expect(order.ship_address).to be_nil - - place_order - expect(page).to have_content "Your order has been processed successfully" - - expect(order.reload.bill_address.address1).to eq '123 Your Head' - expect(order.reload.ship_address.address1).to eq '123 Your Head' - - expect(order.customer.bill_address.address1).to eq '123 Your Head' - expect(order.customer.ship_address.address1).to eq '123 Your Head' - - expect(user.reload.bill_address.address1).to eq '123 Your Head' - expect(user.reload.ship_address.address1).to eq '123 Your Head' - end - end - - it "shows only applicable content" do - expect(page).not_to have_content("You have an order for this order cycle already.") - - expect(page).not_to have_link("Terms and Conditions") - - # We always have this link in the footer. - within "#checkout_form" do - expect(page).not_to have_link("Terms of service") - end - end - end - - context "when distributor has T&Cs" do - before do - order.distributor.terms_and_conditions = pdf_upload - order.distributor.save! - end - - describe "when customer has not accepted T&Cs before" do - it "shows a link to the T&Cs and disables checkout button until terms are accepted" do - visit checkout_path - - expect(page).to have_link("Terms and Conditions") - - expect(page).to have_button("Place order now", disabled: true) - - check "accept_terms" - expect(page).to have_button("Place order now", disabled: false) - end - end - - describe "when customer has already accepted T&Cs before" do - before do - customer = create(:customer, enterprise: order.distributor, user:) - customer.update terms_and_conditions_accepted_at: Time.zone.now - end - - it "enables checkout button (because T&Cs are accepted by default)" do - visit checkout_path - expect(page).to have_button("Place order now", disabled: false) - end - - describe "but afterwards the enterprise has uploaded a new T&Cs file" do - before { order.distributor.terms_and_conditions.attach(pdf_upload) } - - it "disables checkout button until terms are accepted" do - visit checkout_path - expect(page).to have_button("Place order now", disabled: true) - end - end - end - end - - context "when the platform's terms of service have to be accepted" do - let(:tos_url) { "https://example.org/tos" } - - before do - allow(Spree::Config).to receive(:shoppers_require_tos).and_return(true) - allow(Spree::Config).to receive(:footer_tos_url).and_return(tos_url) - end - - it "shows the terms which need to be accepted" do - visit checkout_path - - within "#checkout_form" do - expect(page).to have_link("Terms of service", href: tos_url) - expect(find_link("Terms of service")[:target]).to eq "_blank" - expect(page).to have_button("Place order now", disabled: true) - end - - check "accept_terms" - expect(page).to have_button("Place order now", disabled: false) - - uncheck "accept_terms" - expect(page).to have_button("Place order now", disabled: true) - end - - context "when the terms have been accepted in the past" do - before do - TermsOfServiceFile.create!( - attachment: pdf_upload, - updated_at: 1.day.ago, - ) - customer = create(:customer, enterprise: order.distributor, user:) - customer.update(terms_and_conditions_accepted_at: Time.zone.now) - end - - it "remembers the acceptance" do - visit checkout_path - - within "#checkout_form" do - expect(page).to have_link("Terms of service") - expect(page).to have_button("Place order now", disabled: false) - end - - uncheck "accept_terms" - expect(page).to have_button("Place order now", disabled: true) - - check "accept_terms" - expect(page).to have_button("Place order now", disabled: false) - end - end - end - - context "when the seller's terms and the platform's terms have to be accepted" do - let(:tos_url) { "https://example.org/tos" } - - before do - order.distributor.terms_and_conditions = pdf_upload - order.distributor.save! - - allow(Spree::Config).to receive(:shoppers_require_tos).and_return(true) - allow(Spree::Config).to receive(:footer_tos_url).and_return(tos_url) - end - - it "shows links to both terms and all need accepting" do - visit checkout_path - - within "#checkout_form" do - expect(page).to have_link("Terms and Conditions") - expect(page).to have_link("Terms of service", href: tos_url) - expect(page).to have_button("Place order now", disabled: true) - end - - # Both Ts&Cs and TOS appear in the one label for the one checkbox. - check "accept_terms" - expect(page).to have_button("Place order now", disabled: false) - - uncheck "accept_terms" - expect(page).to have_button("Place order now", disabled: true) - end - end - - context "with previous orders" do - let!(:prev_order) { - create(:completed_order_with_totals, order_cycle:, distributor:, - user: order.user) - } - - before do - order.distributor.allow_order_changes = true - order.distributor.save - visit checkout_path - end - - it "informs about previous orders" do - expect(page).to have_content("You have an order for this order cycle already.") - end - end - - context "when the user has a preset shipping and billing address" do - before do - user.bill_address = build(:address) - user.ship_address = build(:address) - user.save! - end - - it "checks out successfully" do - visit checkout_path - - expect(page).to have_content "Shipping info" - find(:xpath, '//*[@id="shipping"]/ng-form/dd').click - find("input[value='#{shipping_with_fee.id}'").click - click_button "Next" - expect(page).to have_content "Payment" - find("input[value='#{check_without_fee.id}'").click - - perform_enqueued_jobs do - place_order - - expect(page).to have_content "Your order has been processed successfully" - - expect(ActionMailer::Base.deliveries.first.subject).to match(/Order Confirmation/) - expect(ActionMailer::Base.deliveries.second.subject).to match(/Order Confirmation/) - end - - order = Spree::Order.complete.last - expect(order.payment_state).to eq "balance_due" - expect(order.shipment_state).to eq "pending" - end - end - end - - pending "guest checkout" do - before do - visit checkout_path - checkout_as_guest - end - - it "shows the current distributor" do - visit checkout_path - expect(page).to have_content distributor.name - end - - it 'does not show the save as default address checkbox' do - expect(page).not_to have_content "Save as default billing address" - expect(page).not_to have_content "Save as default shipping address" - end - - it "shows a breakdown of the order price" do - choose shipping_with_fee.name - - expect(page).to have_selector 'orderdetails .cart-total', text: with_currency(11.23) - expect(page).to have_selector 'orderdetails .shipping', text: with_currency(4.56) - expect(page).to have_selector 'orderdetails .total', text: with_currency(15.79) - - # Tax should not be displayed in checkout, as the customer's choice of shipping method - # affects the tax and we haven't written code to live-update the tax amount when they - # make a change. - expect(page).not_to have_content product.tax_category.name - end - - it "shows all shipping methods in order by name" do - within '#shipping' do - # Three shipping methods + instructions label - expect(page).to have_selector "label", count: 4 - labels = page.all('label').map(&:text) - expect(labels[0]).to start_with("Donkeys") # shipping_with_fee - expect(labels[1]).to start_with("Frogs") # free_shipping - expect(labels[2]).to start_with("Local") # tagged_shipping - end - end - - context "when shipping method requires an address" do - before do - choose free_shipping.name - end - it "shows ship address forms when 'same as billing address' is unchecked" do - uncheck "Shipping address same as billing address?" - expect(find("#ship_address > div.visible").visible?).to be true - end - end - - it "filters out 'Back office only' shipping methods" do - expect(page).to have_content shipping_with_fee.name - shipping_with_fee.update_attribute :display_on, 'back_end' # Back office only - - visit checkout_path - checkout_as_guest - expect(page).not_to have_content shipping_with_fee.name - end - - context "using FilterShippingMethods" do - let(:user) { create(:user) } - let(:customer) { create(:customer, user:, enterprise: distributor) } - - it "shows shipping methods allowed by the rule" do - # No rules in effect - expect(page).to have_content "Frogs" - expect(page).to have_content "Donkeys" - expect(page).to have_content "Local" - - create(:filter_shipping_methods_tag_rule, - enterprise: distributor, - preferred_customer_tags: "local", - preferred_shipping_method_tags: "local", - preferred_matched_shipping_methods_visibility: 'visible') - create(:filter_shipping_methods_tag_rule, - enterprise: distributor, - is_default: true, - preferred_shipping_method_tags: "local", - preferred_matched_shipping_methods_visibility: 'hidden') - visit checkout_path - checkout_as_guest - - # Default rule in effect, disallows access to 'Local' - expect(page).to have_content "Frogs" - expect(page).to have_content "Donkeys" - expect(page).not_to have_content "Local" - - login_as(user) - visit checkout_path - - # Default rule in still effect, disallows access to 'Local' - expect(page).to have_content "Frogs" - expect(page).to have_content "Donkeys" - expect(page).not_to have_content "Local" - - customer.update_attribute(:tag_list, "local") - visit checkout_path - - # #local Customer can access 'Local' shipping method - expect(page).to have_content "Frogs" - expect(page).to have_content "Donkeys" - expect(page).to have_content "Local" - end - end - - it "shows all available payment methods" do - expect(page).to have_content check_without_fee.name - expect(page).to have_content check_with_fee.name - expect(page).to have_content paypal.name - end - - describe "purchasing" do - it "takes us to the order confirmation page when we submit a complete form" do - fill_out_details - fill_out_billing_address - - within "#shipping" do - choose shipping_with_fee.name - fill_in 'Any comments or special instructions?', with: "SpEcIaL NoTeS" - end - - within "#payment" do - choose check_without_fee.name - end - - expect do - place_order - expect(page).to have_content "Your order has been processed successfully" - end.to have_enqueued_mail(Spree::OrderMailer, :confirm_email_for_customer) - - # And the order's special instructions should be set - order = Spree::Order.complete.last - expect(order.special_instructions).to eq "SpEcIaL NoTeS" - - # Shipment and payments states should be set - expect(order.payment_state).to eq "balance_due" - expect(order.shipment_state).to eq "pending" - - # And the Spree tax summary should not be displayed - expect(page).not_to have_content product.tax_category.name - - # And the total tax for the order, including shipping and fee tax, should be displayed - # product tax ($10.00 @ 10% = $0.91) - # + fee tax ($ 1.23 @ 10% = $0.11) - # + shipping tax ($ 4.56 @ 25% = $0.91) - # = $1.93 - expect(page).to have_content '(includes tax)' - expect(page).to have_content with_currency(1.93) - expect(page).to have_content 'Back To Store' - end - - context "with basic details filled" do - before do - choose free_shipping.name - choose check_without_fee.name - fill_out_details - fill_out_billing_address - check "Shipping address same as billing address?" - end - - it "takes us to the order confirmation page when submitted with " \ - "'same as billing address' checked" do - place_order - expect(page).to have_content "Your order has been processed successfully" - - order = Spree::Order.complete.last - expect(order.payment_state).to eq "balance_due" - expect(order.shipment_state).to eq "pending" - end - - it "takes us to the cart page with an error when a product becomes out of stock just " \ - "before we purchase" do - variant.on_demand = false - variant.on_hand = 0 - variant.save! - - place_order - - expect(page).not_to have_content "Your order has been processed successfully" - expect(page).to have_selector 'closing', text: "Your shopping cart" - expect(page).to have_content "An item in your cart has become unavailable." - end - - context "when we are charged a shipping fee" do - before { choose shipping_with_fee.name } - - it "creates a payment for the full amount inclusive of shipping" do - place_order - expect(page).to have_content "Your order has been processed successfully" - - # There are two orders - our order and our new cart - order = Spree::Order.complete.last - expect(order.shipment_adjustments.first.amount).to eq(4.56) - expect(order.payments.first.amount).to eq(10 + 1.23 + 4.56) # items + fees + shipping - expect(order.payment_state).to eq "balance_due" - expect(order.shipment_state).to eq "pending" - end - end - - context "when we are charged a payment method fee (transaction fee)" do - it "creates a payment including the transaction fee" do - # Selecting the transaction fee, it is displayed - expect(page).to have_selector ".transaction-fee td", text: with_currency(0.00) - expect(page).to have_selector ".total", text: with_currency(11.23) - - choose "#{check_with_fee.name} (#{with_currency(5.67)})" - - expect(page).to have_selector ".transaction-fee td", text: with_currency(5.67) - expect(page).to have_selector ".total", text: with_currency(16.90) - - place_order - expect(page).to have_content "Your order has been processed successfully" - - # There are two orders - our order and our new cart - order = Spree::Order.complete.last - expect(order.all_adjustments.payment_fee.first.amount).to eq 5.67 - expect(order.payments.first.amount).to eq(10 + 1.23 + 5.67) # items + fees + transaction - expect(order.payment_state).to eq "balance_due" - expect(order.shipment_state).to eq "pending" - end - end - - describe "credit card payments" do - context "with a credit card payment method using Stripe" do - let!(:check_without_fee) { - create(:payment_method, distributors: [distributor], name: "Roger Rabbit", - type: "Spree::Gateway::StripeSCA") - } - - it "takes us to the order confirmation page when submitted " \ - "with a valid credit card" do - fill_in 'Card Number', with: "4111111111111111" - select 'February', from: 'secrets.card_month' - select (Date.current.year + 1).to_s, from: 'secrets.card_year' - fill_in 'Security Code', with: '123' - - place_order - expect(page).to have_content "Your order has been processed successfully" - - # Order should have a payment with the correct amount - order = Spree::Order.complete.last - expect(order.payments.first.amount).to eq(11.23) - expect(order.payment_state).to eq "paid" - expect(order.shipment_state).to eq "ready" - end - - it "shows the payment processing failed message when submitted " \ - "with an invalid credit card" do - fill_in 'Card Number', with: "9999999988887777" - select 'February', from: 'secrets.card_month' - select (Date.current.year + 1).to_s, from: 'secrets.card_year' - fill_in 'Security Code', with: '123' - - place_order - expect(page).to have_content 'Bogus Gateway: Forced failure' - - # Does not show duplicate shipping fee - visit checkout_path - expect(page).to have_selector "th", text: "Shipping", count: 1 - end - end - end - end - end - end -end diff --git a/spec/system/consumer/shopping/checkout_stripe_spec.rb b/spec/system/consumer/shopping/checkout_stripe_spec.rb index 28b184b7d1b..7758f582db2 100644 --- a/spec/system/consumer/shopping/checkout_stripe_spec.rb +++ b/spec/system/consumer/shopping/checkout_stripe_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Check out with Stripe" do +RSpec.describe "Check out with Stripe" do include AuthenticationHelper include ShopWorkflow include CheckoutRequestsHelper diff --git a/spec/system/consumer/shopping/embedded_groups_spec.rb b/spec/system/consumer/shopping/embedded_groups_spec.rb index f157b2cd694..b59f59ca3ca 100644 --- a/spec/system/consumer/shopping/embedded_groups_spec.rb +++ b/spec/system/consumer/shopping/embedded_groups_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Using embedded shopfront functionality" do +RSpec.describe "Using embedded shopfront functionality" do include OpenFoodNetwork::EmbeddedPagesHelper describe 'embedded groups' do diff --git a/spec/system/consumer/shopping/orders_spec.rb b/spec/system/consumer/shopping/orders_spec.rb index 0aaf4e4cc7c..590ad801e65 100644 --- a/spec/system/consumer/shopping/orders_spec.rb +++ b/spec/system/consumer/shopping/orders_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "Order Management" do +RSpec.describe "Order Management" do include AuthenticationHelper describe "viewing a completed order" do diff --git a/spec/system/consumer/shopping/products_spec.rb b/spec/system/consumer/shopping/products_spec.rb index fdef556152e..81a21613be8 100644 --- a/spec/system/consumer/shopping/products_spec.rb +++ b/spec/system/consumer/shopping/products_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "As a consumer I want to view products" do +RSpec.describe "As a consumer I want to view products" do include AuthenticationHelper include WebHelper include ShopWorkflow diff --git a/spec/system/consumer/shopping/shopping_spec.rb b/spec/system/consumer/shopping/shopping_spec.rb index 9694059eb12..7868c733824 100644 --- a/spec/system/consumer/shopping/shopping_spec.rb +++ b/spec/system/consumer/shopping/shopping_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "As a consumer I want to shop with a distributor" do +RSpec.describe "As a consumer I want to shop with a distributor" do include AuthenticationHelper include FileHelper include WebHelper diff --git a/spec/system/consumer/shopping/unit_price_spec.rb b/spec/system/consumer/shopping/unit_price_spec.rb index de195c11594..85da774add6 100644 --- a/spec/system/consumer/shopping/unit_price_spec.rb +++ b/spec/system/consumer/shopping/unit_price_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe "As a consumer, I want to check unit price information for a product" do +RSpec.describe "As a consumer, I want to check unit price information for a product" do include AuthenticationHelper include WebHelper include ShopWorkflow diff --git a/spec/system/consumer/shopping/variant_overrides_spec.rb b/spec/system/consumer/shopping/variant_overrides_spec.rb index 20ef2a51229..cda13c44597 100644 --- a/spec/system/consumer/shopping/variant_overrides_spec.rb +++ b/spec/system/consumer/shopping/variant_overrides_spec.rb @@ -2,12 +2,13 @@ require 'system_helper' -describe "shopping with variant overrides defined" do +RSpec.describe "shopping with variant overrides defined" do include AuthenticationHelper include WebHelper include ShopWorkflow include CheckoutRequestsHelper include UIComponentHelper + include CheckoutHelper let(:hub) { create(:distributor_enterprise, with_payment_and_shipping: true) } let(:producer) { create(:supplier_enterprise) } @@ -150,23 +151,27 @@ expect(page).to have_selector "#edit-cart .grand-total", text: with_currency(122.22) end - pending "prices in the checkout" do + context "prices in the checkout" do it "shows the correct prices" do click_add_to_cart product1_variant1, 2 click_checkout + checkout_as_guest - expect(page).to have_selector 'form.edit_order .cart-total', text: with_currency(122.22) - expect(page).to have_selector 'form.edit_order .shipping', text: with_currency(0.00) - expect(page).to have_selector 'form.edit_order .total', text: with_currency(122.22) + fill_out_details + fill_out_billing_address + + proceed_to_payment + proceed_to_summary + + expect(page).to have_selector '.summary-right-line-value', text: with_currency(122.22) + expect(page).to have_selector '#order_total', text: with_currency(122.22) end end end - pending "creating orders" do + describe "creating orders" do it "creates the order with the correct prices" do click_add_to_cart product1_variant1, 2 - click_checkout - complete_checkout o = Spree::Order.complete.last @@ -228,32 +233,17 @@ private def complete_checkout - checkout_as_guest + click_checkout - within "#details" do - fill_in "First Name", with: "Some" - fill_in "Last Name", with: "One" - fill_in "Email", with: "test@example.com" - fill_in "Phone", with: "0456789012" - end + checkout_as_guest - within "#billing" do - fill_in "Address", with: "123 Street" - select "Australia", from: "Country" - select "Victoria", from: "State" - fill_in "City", with: "Melbourne" - fill_in "Postcode", with: "3066" - end + fill_out_details + fill_out_billing_address - within "#shipping" do - choose sm.name - end - - within "#payment" do - choose pm.name - end + proceed_to_payment + proceed_to_summary - place_order + click_on "Complete order" expect(page).to have_content "Your order has been processed successfully" end diff --git a/spec/system/consumer/shops_spec.rb b/spec/system/consumer/shops_spec.rb index 02fccfd1304..d36a9ca6c1d 100644 --- a/spec/system/consumer/shops_spec.rb +++ b/spec/system/consumer/shops_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'Shops' do +RSpec.describe 'Shops' do include AuthenticationHelper include UIComponentHelper include WebHelper diff --git a/spec/system/consumer/sitemap_spec.rb b/spec/system/consumer/sitemap_spec.rb index 93b3ebe655e..255606c2aed 100644 --- a/spec/system/consumer/sitemap_spec.rb +++ b/spec/system/consumer/sitemap_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'sitemap' do +RSpec.describe 'sitemap' do let(:enterprise) { create(:distributor_enterprise) } let!(:group) { create(:enterprise_group, enterprises: [enterprise], on_front_page: true) } diff --git a/spec/system/consumer/user_password_spec.rb b/spec/system/consumer/user_password_spec.rb index a744aac85cc..6638541b974 100644 --- a/spec/system/consumer/user_password_spec.rb +++ b/spec/system/consumer/user_password_spec.rb @@ -2,7 +2,7 @@ require "system_helper" -describe "User password confirm/reset page" do +RSpec.describe "User password confirm/reset page" do include UIComponentHelper let(:email) { "test@example.org" } diff --git a/spec/system/consumer/white_label_spec.rb b/spec/system/consumer/white_label_spec.rb index 6fe7645ec6f..73aa8065a99 100644 --- a/spec/system/consumer/white_label_spec.rb +++ b/spec/system/consumer/white_label_spec.rb @@ -2,7 +2,7 @@ require 'system_helper' -describe 'White label setting' do +RSpec.describe 'White label setting' do include AuthenticationHelper include ShopWorkflow include FileHelper diff --git a/spec/validators/date_time_string_validator_spec.rb b/spec/validators/date_time_string_validator_spec.rb index a4b5d7a4681..17539a42abf 100644 --- a/spec/validators/date_time_string_validator_spec.rb +++ b/spec/validators/date_time_string_validator_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe DateTimeStringValidator do +RSpec.describe DateTimeStringValidator do describe "internationalization" do it "has translation for NOT_STRING_ERROR" do expect(described_class.not_string_error).not_to be_blank diff --git a/spec/validators/integer_array_validator_spec.rb b/spec/validators/integer_array_validator_spec.rb index 0643d02806b..fc447f7df28 100644 --- a/spec/validators/integer_array_validator_spec.rb +++ b/spec/validators/integer_array_validator_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe IntegerArrayValidator do +RSpec.describe IntegerArrayValidator do describe "internationalization" do it "has translation for NOT_ARRAY_ERROR" do expect(described_class.not_array_error).not_to be_blank diff --git a/spec/views/admin/products_v3/_filters.html.haml_spec.rb b/spec/views/admin/products_v3/_filters.html.haml_spec.rb index b9ae7725c29..7eff206b7ee 100644 --- a/spec/views/admin/products_v3/_filters.html.haml_spec.rb +++ b/spec/views/admin/products_v3/_filters.html.haml_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "admin/products_v3/_filters.html.haml" do +RSpec.describe "admin/products_v3/_filters.html.haml" do subject { render } let(:locals) do diff --git a/spec/views/checkout/_voucher_section.html.haml_spec.rb b/spec/views/checkout/_voucher_section.html.haml_spec.rb index 36aa3e07766..f60d80d03b9 100644 --- a/spec/views/checkout/_voucher_section.html.haml_spec.rb +++ b/spec/views/checkout/_voucher_section.html.haml_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "checkout/_voucher_section.html.haml" do +RSpec.describe "checkout/_voucher_section.html.haml" do let(:order) { create(:order_with_distributor, total: 10) } let(:flat_voucher) { create(:voucher_flat_rate, code: "flat_code", diff --git a/spec/views/layouts/darkswarm.html.haml_spec.rb b/spec/views/layouts/darkswarm.html.haml_spec.rb index 8cf60679df0..286f301a94a 100644 --- a/spec/views/layouts/darkswarm.html.haml_spec.rb +++ b/spec/views/layouts/darkswarm.html.haml_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "layouts/darkswarm.html.haml" do +RSpec.describe "layouts/darkswarm.html.haml" do helper InjectionHelper helper I18nHelper helper ShopHelper diff --git a/spec/views/layouts/registration.html.haml_spec.rb b/spec/views/layouts/registration.html.haml_spec.rb index 9beac670a76..07eac914860 100644 --- a/spec/views/layouts/registration.html.haml_spec.rb +++ b/spec/views/layouts/registration.html.haml_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "layouts/registration.html.haml" do +RSpec.describe "layouts/registration.html.haml" do helper InjectionHelper helper I18nHelper helper ShopHelper diff --git a/spec/views/registration/steps/_details.html.haml_spec.rb b/spec/views/registration/steps/_details.html.haml_spec.rb new file mode 100644 index 00000000000..b903b5d7481 --- /dev/null +++ b/spec/views/registration/steps/_details.html.haml_spec.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe "registration/steps/_details.html.haml" do + subject { render } + + it "uses Google Maps when it is enabled" do + allow(view).to receive_messages(using_google_maps?: true) + + is_expected.to match // + end + + it "uses OpenStreetMap when it is enabled" do + ContentConfig.open_street_map_enabled = true + allow(view).to receive_messages(using_google_maps?: false) + + is_expected.to match /
/ + end +end diff --git a/spec/views/spree/admin/orders/edit.html.haml_spec.rb b/spec/views/spree/admin/orders/edit.html.haml_spec.rb index 9376b9188e7..644af45b888 100644 --- a/spec/views/spree/admin/orders/edit.html.haml_spec.rb +++ b/spec/views/spree/admin/orders/edit.html.haml_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "spree/admin/orders/edit.html.haml" do +RSpec.describe "spree/admin/orders/edit.html.haml" do helper Spree::BaseHelper # required to make pretty_time work helper Spree::Admin::NavigationHelper helper Admin::InjectionHelper diff --git a/spec/views/spree/admin/orders/index.html.haml_spec.rb b/spec/views/spree/admin/orders/index.html.haml_spec.rb index 04641e51596..c28da03214d 100644 --- a/spec/views/spree/admin/orders/index.html.haml_spec.rb +++ b/spec/views/spree/admin/orders/index.html.haml_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "spree/admin/orders/index.html.haml" do +RSpec.describe "spree/admin/orders/index.html.haml" do helper Spree::Admin::NavigationHelper helper EnterprisesHelper diff --git a/spec/views/spree/admin/orders/invoice.html.haml_spec.rb b/spec/views/spree/admin/orders/invoice.html.haml_spec.rb index c76950e8692..a49b25d426f 100644 --- a/spec/views/spree/admin/orders/invoice.html.haml_spec.rb +++ b/spec/views/spree/admin/orders/invoice.html.haml_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "spree/admin/orders/invoice.html.haml" do +RSpec.describe "spree/admin/orders/invoice.html.haml" do let(:shop) { create(:distributor_enterprise) } let(:order) { create(:completed_order_with_totals, distributor: shop) } let(:adas_address) do diff --git a/spec/views/spree/admin/payment_methods/index.html.haml_spec.rb b/spec/views/spree/admin/payment_methods/index.html.haml_spec.rb index e5f1f2def39..95ee8a0ab59 100644 --- a/spec/views/spree/admin/payment_methods/index.html.haml_spec.rb +++ b/spec/views/spree/admin/payment_methods/index.html.haml_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "spree/admin/payment_methods/index.html.haml" do +RSpec.describe "spree/admin/payment_methods/index.html.haml" do include AuthenticationHelper helper Spree::Admin::NavigationHelper helper Spree::Admin::BaseHelper diff --git a/spec/views/spree/orders/edit.html.haml_spec.rb b/spec/views/spree/orders/edit.html.haml_spec.rb index 421d7c535b9..cb1186592bf 100644 --- a/spec/views/spree/orders/edit.html.haml_spec.rb +++ b/spec/views/spree/orders/edit.html.haml_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "spree/orders/edit.html.haml" do +RSpec.describe "spree/orders/edit.html.haml" do helper InjectionHelper helper ShopHelper helper ApplicationHelper diff --git a/spec/views/spree/orders/show.html.haml_spec.rb b/spec/views/spree/orders/show.html.haml_spec.rb index 6ce839a6e8f..a1d238f4721 100644 --- a/spec/views/spree/orders/show.html.haml_spec.rb +++ b/spec/views/spree/orders/show.html.haml_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "spree/orders/show.html.haml" do +RSpec.describe "spree/orders/show.html.haml" do helper InjectionHelper helper ShopHelper helper ApplicationHelper diff --git a/spec/views/spree/shared/_order_details.html.haml_spec.rb b/spec/views/spree/shared/_order_details.html.haml_spec.rb index 0224bdc37a5..3acc484f0e4 100644 --- a/spec/views/spree/shared/_order_details.html.haml_spec.rb +++ b/spec/views/spree/shared/_order_details.html.haml_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "spree/shared/_order_details.html.haml" do +RSpec.describe "spree/shared/_order_details.html.haml" do include AuthenticationHelper helper Spree::BaseHelper helper CheckoutHelper diff --git a/swagger/dfc.yaml b/swagger/dfc.yaml index a96c33c2e74..f75cd154dc6 100644 --- a/swagger/dfc.yaml +++ b/swagger/dfc.yaml @@ -376,7 +376,7 @@ paths: dfc-b:hasAddress: http://test.host/api/dfc/addresses/40000 dfc-b:hasPhoneNumber: 0404 444 000 200 dfc-b:email: hello@example.org - dfc-b:websitePage: openfoodnetwork.org + dfc-b:websitePage: https://openfoodnetwork.org dfc-b:hasSocialMedia: http://test.host/api/dfc/enterprises/10000/social_medias/facebook dfc-b:logo: '' dfc-b:name: Fred's Farm diff --git a/yarn.lock b/yarn.lock index d84ee5e204c..d76813d5eb3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1099,10 +1099,10 @@ dependencies: "@floating-ui/utils" "^0.2.1" -"@floating-ui/dom@^1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef" - integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== +"@floating-ui/dom@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.5.tgz#323f065c003f1d3ecf0ff16d2c2c4d38979f4cb9" + integrity sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw== dependencies: "@floating-ui/core" "^1.0.0" "@floating-ui/utils" "^0.2.0" @@ -1112,12 +1112,19 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@googlemaps/js-api-loader@^1.16.6": + version "1.16.6" + resolved "https://registry.yarnpkg.com/@googlemaps/js-api-loader/-/js-api-loader-1.16.6.tgz#c89970c94b55796d51746c092f0e52953994a171" + integrity sha512-V8p5W9DbPQx74jWUmyYJOerhiB4C+MHekaO0ZRmc6lrOYrvY7+syLhzOWpp55kqSPeNb+qbC2h8i69aLIX6krQ== + dependencies: + fast-deep-equal "^3.1.3" + "@hotwired/stimulus-webpack-helpers@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@hotwired/stimulus-webpack-helpers/-/stimulus-webpack-helpers-1.0.1.tgz#4cd74487adeca576c9865ac2b9fe5cb20cef16dd" integrity sha512-wa/zupVG0eWxRYJjC1IiPBdt3Lruv0RqGN+/DTMmUWUyMAEB27KXmVY6a8YpUVTM7QwVuaLNGW4EqDgrS2upXQ== -"@hotwired/stimulus@^3", "@hotwired/stimulus@^3.2.2": +"@hotwired/stimulus@^3", "@hotwired/stimulus@^3.2", "@hotwired/stimulus@^3.2.2": version "3.2.2" resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.2.tgz#071aab59c600fed95b97939e605ff261a4251608" integrity sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A== @@ -2444,10 +2451,10 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cable_ready@5.0.1, cable_ready@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/cable_ready/-/cable_ready-5.0.1.tgz#1cef5991cf7a064d09971ed7d87c614dec2ee1e1" - integrity sha512-+t9rKTgYwW5XBx113y97qC8MNEtBZZL84Isdec23HWvjMx0icOQsMzHJE75ycjevgjACTeWZqjRcCdtCHxgZ9g== +cable_ready@5.0.5, cable_ready@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/cable_ready/-/cable_ready-5.0.5.tgz#45dd12ae5b3c5c53a1b42c10785e79ff87a5be22" + integrity sha512-qPC6zaI8h59BzMH3MxtpuMC+H33VJTA2eVddL6fZSWz01jJ2Y3okld01oYWQoKwE2yle/tvHbyuhoKxD4mhEuw== dependencies: morphdom "2.6.1" @@ -3911,7 +3918,7 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -5501,10 +5508,10 @@ jest@^27.4.7: import-local "^3.0.2" jest-cli "^27.5.1" -jquery-ui@1.13.2: - version "1.13.2" - resolved "https://registry.yarnpkg.com/jquery-ui/-/jquery-ui-1.13.2.tgz#de03580ae6604773602f8d786ad1abfb75232034" - integrity sha512-wBZPnqWs5GaYJmo1Jj0k/mrSkzdQzKDwhXNtHKcBdAcKVxMM3KNYFq+iJ2i1rwiG53Z8M4mTn3Qxrm17uH1D4Q== +jquery-ui@1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/jquery-ui/-/jquery-ui-1.13.3.tgz#d9f5292b2857fa1f2fdbbe8f2e66081664eb9bc5" + integrity sha512-D2YJfswSJRh/B8M/zCowDpNFfwsDmtfnMPwjJTyvl+CBqzpYwQ+gFYIbUUlzijy/Qvoy30H1YhoSui4MNYpRwA== dependencies: jquery ">=1.8.0 <4.0.0" @@ -5707,6 +5714,24 @@ last-call-webpack-plugin@^3.0.0: lodash "^4.17.5" webpack-sources "^1.1.0" +leaflet-geosearch@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/leaflet-geosearch/-/leaflet-geosearch-4.0.0.tgz#d7488830004515452368d333f7a49d06d59ea81b" + integrity sha512-a92VNY9gxyv3oyEDqIWoCNoBllajWRYejztzOSNmpLRtzpA6JtGgy/wwl9tsB8+6Eek1fe+L6+W0MDEOaidbXA== + optionalDependencies: + "@googlemaps/js-api-loader" "^1.16.6" + leaflet "^1.6.0" + +leaflet-providers@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/leaflet-providers/-/leaflet-providers-2.0.0.tgz#dfdab9ca2dccc57c79e1462bc3dd20f78910afcb" + integrity sha512-CWwKEnHd66Qsx0m4o5q5ZOa60s00B91pMxnlr4Y22msubfs7dhbZhdMIz8bvZQkrZqi67ppI1fsZRS6vtrLcOA== + +leaflet@1.9.4, leaflet@^1.6.0: + version "1.9.4" + resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.9.4.tgz#23fae724e282fa25745aff82ca4d394748db7d8d" + integrity sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -8373,14 +8398,14 @@ stimulus@^3.2.2: "@hotwired/stimulus" "^3.2.2" "@hotwired/stimulus-webpack-helpers" "^1.0.0" -stimulus_reflex@3.5.0-rc3: - version "3.5.0-rc3" - resolved "https://registry.yarnpkg.com/stimulus_reflex/-/stimulus_reflex-3.5.0-rc3.tgz#21196b2a42f48ea7f1fad54f8443d09a95c320a5" - integrity sha512-KSRDgGkU4aA77yw1b0W0oP7Ag+SB6Aa36BdcBJTpacU2W0bm9Fz1a0o9ynD+YAWK6AUyJ0gR20wXLvBvBGpnpg== +stimulus_reflex@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/stimulus_reflex/-/stimulus_reflex-3.5.1.tgz#fb9c548667e01b8dc7141187c73abfe1aa25472a" + integrity sha512-Bwsuerfh8ca6kp7MKlUgzYAmeflqoBzSpb25M4i+h3FsmAfPl4rUNN6T8v1d6JPqAPAVQRUL/wtDHumLtpETFw== dependencies: "@hotwired/stimulus" "^3" "@rails/actioncable" "^6 || ^7" - cable_ready "^5.0.0" + cable_ready "^5.0.5" stream-browserify@^2.0.1: version "2.0.2" @@ -8803,10 +8828,10 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" -trix@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trix/-/trix-2.1.0.tgz#da9daddded6ee0cb2ba5676246bb343e1d45eaab" - integrity sha512-TPhgGvIjM1VqcfoR/OQQERRlMDuEw7UBIoGroJGuiTmu5yqk5KqR29ZzPgGIoOJgsqoAgxGUCK92+CRJLoO43Q== +trix@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/trix/-/trix-2.1.1.tgz#688f1213601316cf8b92c5e625d2f562c118c780" + integrity sha512-IljOMGOlRUPg1i5Pk/+x/Ia65ZY7Gw5JxxKCh/4caxG5ZaKuFJCKdn1+TF0efUYfdg+bqWenB/mAYCHjZu0zpQ== ts-pnp@^1.1.6: version "1.2.0" @@ -9381,16 +9406,16 @@ write-file-atomic@^3.0.0: typedarray-to-buffer "^3.1.5" ws@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + version "6.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.3.tgz#ccc96e4add5fd6fedbc491903075c85c5a11d9ee" + integrity sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA== dependencies: async-limiter "~1.0.0" ws@^7.4.6: - version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" - integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== ws@~8.11.0: version "8.11.0"