diff --git a/.codegenignore b/.codegenignore new file mode 100644 index 0000000..0963e3d --- /dev/null +++ b/.codegenignore @@ -0,0 +1,6 @@ +test/unit_tests/** +test/flows/** +.gitignore +.github/** +Rakefile +Gemfile diff --git a/.github/workflows/test-runner.yml b/.github/workflows/test-runner.yml new file mode 100644 index 0000000..e846566 --- /dev/null +++ b/.github/workflows/test-runner.yml @@ -0,0 +1,49 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake +# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby + +name: Run Tests + +on: + workflow_dispatch: + +permissions: + contents: read + +jobs: + test-runner: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.0 + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + - name: Create Environment + run: | + touch .env + echo EMAIL=${{ secrets.EMAIL }} >> .env + echo PASSWORD=${{ secrets.PASSWORD }} >> .env + echo CLIENT_ID=${{ secrets.CLIENT_ID }} >> .env + echo CLIENT_SECRET=${{ secrets.CLIENT_SECRET }} >> .env + cat .env + - name: Add Web Driver Dependency + run: | + gem install selenium-webdriver -v 4.23 && bundle add selenium-webdriver + - name: Add UI Testing Framework Dependency + run: | + gem install capybara -v 3.40 && bundle add capybara + - name: Add Minitest Dependency + run: | + gem install minitest -v 5.24 && bundle add minitest + gem install minitest-proveit -v 1.0 && bundle add minitest-proveit + - name: Add DotEnv Dependency + run: | + gem install dotenv && bundle add dotenv + - name: Run Tests + run: bundle exec rake diff --git a/.gitignore b/.gitignore index b844b14..54c97d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ Gemfile.lock +.env \ No newline at end of file diff --git a/Gemfile b/Gemfile index fa75df1..e0d55aa 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,7 @@ source 'https://rubygems.org' +group :test do + gem 'rake' +end + gemspec diff --git a/Rakefile b/Rakefile index 8944c8a..420fa09 100644 --- a/Rakefile +++ b/Rakefile @@ -2,3 +2,12 @@ lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require "bundler/gem_tasks" +require 'rake/testtask' + +Rake::TestTask.new(:test) do |t| + t.libs << "test" + t.test_files = FileList['test/**/test_*.rb', 'spec/**/*_spec.rb'] + t.warning = false +end + +task :default => :test diff --git a/test/flows/flow_test_base.rb b/test/flows/flow_test_base.rb new file mode 100644 index 0000000..85c19a9 --- /dev/null +++ b/test/flows/flow_test_base.rb @@ -0,0 +1,21 @@ +require 'json' +require 'minitest/autorun' +require 'paypal_server_sdk' +require_relative '../flows/ui_flow_executor' +require 'dotenv' + +class FlowTestBase < Minitest::Test + include PaypalServerSdk + include CoreLibrary + Dotenv.load + + def setup_class + _config = Configuration.new( + environment: Environment::SANDBOX, + client_credentials_auth_credentials: ClientCredentialsAuthCredentials.new( + o_auth_client_id: ENV['CLIENT_ID'], + o_auth_client_secret: ENV['CLIENT_SECRET'])) + @client = Client.new(config: _config) + @ui_flow_executor = UIFlowExecutor.new + end +end diff --git a/test/flows/tests/test_add_shipping_tracker_flow.rb b/test/flows/tests/test_add_shipping_tracker_flow.rb new file mode 100644 index 0000000..b354d2f --- /dev/null +++ b/test/flows/tests/test_add_shipping_tracker_flow.rb @@ -0,0 +1,108 @@ +require_relative '../flow_test_base' +require 'securerandom' + +class AddShippingTrackerFlowTest < FlowTestBase + + def setup + setup_class + @orders_controller = @client.orders + end + + def test_add_shipping_tracker_flow + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::CAPTURE, + purchase_units: [ + PurchaseUnitRequest.new( + amount: AmountWithBreakdown.new( + currency_code: 'USD', + value: '10.00', + breakdown: AmountBreakdown.new( + item_total: Money.new(currency_code: 'USD', value: '10.0'), + shipping: Money.new(currency_code: 'USD', value: '0.0'), + tax_total: Money.new(currency_code: 'USD', value: '0')) + ), + description: 'Camera Shop', + items: [ + Item.new( + name: 'Levis 501 Selvedge STF', + unit_amount: Money.new(currency_code: 'USD', value: '5.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '5158936'), + Item.new( + name: 'T-Shirt', + unit_amount: Money.new(currency_code: 'USD', value: '5.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '1457432') + ], + shipping: ShippingDetails.new( + address: Address.new( + country_code: 'US', + address_line_1: '123 Main Street', + admin_area_1: 'CA', + admin_area_2: 'San Jose', + postal_code: '95131')) + ) + ], + payment_source: PaymentSource.new( + paypal: PayPalWallet.new( + experience_context: PayPalWalletExperienceContext.new( + locale: 'en-US', + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl'))) + ), + 'prefer' => 'return=representation' + } + order_api_response = @orders_controller.orders_create(request) + assert_equal(200, order_api_response.status_code) + + current_path = @ui_flow_executor.complete_payment(url: order_api_response.data.links.at(1).href) + assert_equal '/returnUrl', current_path + + request = { + 'id' => order_api_response.data.id, + 'prefer' => 'return=representation' + } + captured_order_api_response = @orders_controller.orders_capture(request) + assert_equal(201, captured_order_api_response.status_code) + + request = { + 'id' => order_api_response.data.id, + 'body' => OrderTrackerRequest.new( + capture_id: captured_order_api_response.data.purchase_units.at(0).payments.captures.at(0).id, + tracking_number: '443844607820', + carrier: ShipmentCarrier::FEDEX, + notify_payer: false, + items: [ + OrderTrackerItem.new( + name: 'T-Shirt', + quantity: '1', + sku: 'sku02', + url: 'https://www.example.com/example', + image_url: 'https://www.example.com/example.jpg', + upc: UniversalProductCode.new( + type: UPCType::UPCA, + code: 'upc001')) + ]) + } + tracked_order_api_response = @orders_controller.orders_track_create(request) + assert_equal(201, tracked_order_api_response.status_code) + + request = { + 'id' => order_api_response.data.id, + 'tracker_id' => tracked_order_api_response.data.purchase_units.at(0).shipping.trackers.at(0).id, + 'body' => [Patch.new(op: PatchOp::REPLACE, path: '/notify_payer', value: true)] + } + order_tracker_api_response = @orders_controller.orders_trackers_patch(request) + assert_equal(204, order_tracker_api_response.status_code) + + teardown + end + + def teardown + @ui_flow_executor.reset_browser_session + end + +end \ No newline at end of file diff --git a/test/flows/tests/test_authorization_flow.rb b/test/flows/tests/test_authorization_flow.rb new file mode 100644 index 0000000..8d86d4e --- /dev/null +++ b/test/flows/tests/test_authorization_flow.rb @@ -0,0 +1,75 @@ +require_relative '../flow_test_base' +require 'securerandom' + +class AuthorizationFlowTest < FlowTestBase + + def setup + setup_class + @orders_controller = @client.orders + @payments_controller = @client.payments + end + + def test_authorization_flow + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::AUTHORIZE, + purchase_units: [ + PurchaseUnitRequest.new( + amount: AmountWithBreakdown.new( + currency_code: 'USD', + value: '25.00', + breakdown: AmountBreakdown.new( + item_total: Money.new(currency_code: 'USD', value: '25.0'), + shipping: Money.new(currency_code: 'USD', value: '0.0'), + tax_total: Money.new(currency_code: 'USD', value: '0')) + ), + description: 'Clothing Shop', + items: [ + Item.new( + name: 'Levis 501', + unit_amount: Money.new(currency_code: 'USD', value: '25.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '5158936') + ] + ) + ], + payment_source: PaymentSource.new( + paypal: PayPalWallet.new( + experience_context: PayPalWalletExperienceContext.new( + locale: 'en-US', + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl', + landing_page: PayPalExperienceLandingPage::LOGIN))) + ), + 'prefer' => 'return=representation' + } + + order_api_response = @orders_controller.orders_create(request) + assert_equal(200, order_api_response.status_code) + + current_path = @ui_flow_executor.complete_payment(url: order_api_response.data.links.at(1).href) + assert_equal '/returnUrl', current_path + + request = { + 'id' => order_api_response.data.id, + 'prefer' => 'return=representation' + } + authorized_order_api_response = @orders_controller.orders_authorize(request) + assert_equal(201, authorized_order_api_response.status_code) + + request = { + 'authorization_id' => authorized_order_api_response.data.purchase_units.at(0).payments.authorizations.at(0).id, + 'prefer' => 'return=representation' + } + api_response = @payments_controller.authorizations_void(request) + assert_equal(200, api_response.status_code) + + teardown + end + + def teardown + @ui_flow_executor.reset_browser_session + end + +end \ No newline at end of file diff --git a/test/flows/tests/test_authorize_and_capture_flow.rb b/test/flows/tests/test_authorize_and_capture_flow.rb new file mode 100644 index 0000000..e3f088a --- /dev/null +++ b/test/flows/tests/test_authorize_and_capture_flow.rb @@ -0,0 +1,88 @@ +require_relative '../flow_test_base' +require 'securerandom' + +class AuthorizeAndCaptureFlowTest < FlowTestBase + + def setup + setup_class + @orders_controller = @client.orders + @payments_controller = @client.payments + end + + def test_authorize_and_capture_flow + guid = SecureRandom.uuid + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::AUTHORIZE, + purchase_units: [ + PurchaseUnitRequest.new( + amount: AmountWithBreakdown.new( + currency_code: 'USD', + value: '25.00', + breakdown: AmountBreakdown.new( + item_total: Money.new(currency_code: 'USD', value: '25.0'), + shipping: Money.new(currency_code: 'USD', value: '0.0'), + tax_total: Money.new(currency_code: 'USD', value: '0')) + ), + description: 'Clothing Shop', + items: [ + Item.new( + name: 'Levis 501', + unit_amount: Money.new(currency_code: 'USD', value: '25.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '5158936') + ] + ) + ], + payment_source: PaymentSource.new( + paypal: PayPalWallet.new( + experience_context: PayPalWalletExperienceContext.new( + locale: 'en-US', + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl', + landing_page: PayPalExperienceLandingPage::LOGIN))) + ), + 'pay_pal_request_id' => guid, + 'pay_pal_partner_attribution_id' => 'PayPal-Partner-Attribution-Id', + 'pay_pal_client_metadata_id' => 'PayPal-Client-Metadata-Id', + 'prefer' => 'return=representation' + } + + order_api_response = @orders_controller.orders_create(request) + assert_equal(200, order_api_response.status_code) + + current_path = @ui_flow_executor.complete_payment(url: order_api_response.data.links.at(1).href) + assert_equal '/returnUrl', current_path + + request = { + 'id' => order_api_response.data.id, + 'prefer' => 'return=representation' + } + authorized_order_api_response = @orders_controller.orders_authorize(request) + assert_equal(201, authorized_order_api_response.status_code) + + request = { + 'authorization_id' => authorized_order_api_response.data.purchase_units.at(0).payments.authorizations.at(0).id, + 'prefer' => 'return=representation', + 'body' => CaptureRequest.new(final_capture: false) + } + captured_payment_api_response = @payments_controller.authorizations_capture(request) + assert_equal(201, captured_payment_api_response.status_code) + + authorized_payment_api_response = @payments_controller.authorizations_get( + authorized_order_api_response.data.purchase_units.at(0).payments.authorizations.at(0).id) + assert_equal(200, authorized_payment_api_response.status_code) + assert_equal(AuthorizationStatus::CAPTURED, authorized_payment_api_response.data.status) + + captured_api_response = @payments_controller.captures_get(captured_payment_api_response.data.id) + assert_equal(200, captured_api_response.status_code) + assert_equal(CaptureStatus::COMPLETED, captured_api_response.data.status) + + teardown + end + + def teardown + @ui_flow_executor.reset_browser_session + end +end diff --git a/test/flows/tests/test_confirm_order_flow.rb b/test/flows/tests/test_confirm_order_flow.rb new file mode 100644 index 0000000..7ea2a81 --- /dev/null +++ b/test/flows/tests/test_confirm_order_flow.rb @@ -0,0 +1,69 @@ +require_relative '../flow_test_base' +require 'securerandom' + +class ConfirmOrderFlowTest < FlowTestBase + + def setup + setup_class + @orders_controller = @client.orders + end + + def test_confirm_order_flow + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::CAPTURE, + purchase_units: [ + PurchaseUnitRequest.new( + amount: AmountWithBreakdown.new( + currency_code: 'USD', + value: '100.00' + ), + reference_id: 'd9f80740-38f0-11e8-b467-0ed5f89f718b' + ) + ], + payment_source: PaymentSource.new( + paypal: PayPalWallet.new( + experience_context: PayPalWalletExperienceContext.new( + locale: 'en-US', + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl', + landing_page: PayPalExperienceLandingPage::LOGIN)) + ) + ), + 'prefer' => 'return=representation' + } + order_api_response = @orders_controller.orders_create(request) + assert_equal(200, order_api_response.status_code) + + current_path = @ui_flow_executor.complete_payment(url: order_api_response.data.links.at(1).href) + assert_equal '/returnUrl', current_path + + request = { + 'id' => order_api_response.data.id, + 'body' => ConfirmOrderRequest.new( + payment_source: PaymentSource.new( + paypal: PayPalWallet.new( + email_address: 'customer@example.com', + name: Name.new(given_name: 'John', surname: 'Doe'), + experience_context: PayPalWalletExperienceContext.new( + brand_name: 'EXAMPLE INC', + locale: 'en-US', + shipping_preference: ShippingPreference::SET_PROVIDED_ADDRESS, + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl', + landing_page: PayPalExperienceLandingPage::LOGIN, + user_action: PayPalExperienceUserAction::PAY_NOW, + payment_method_preference: PayeePaymentMethodPreference::IMMEDIATE_PAYMENT_REQUIRED)))), + 'prefer' => 'return=representation' + } + order_api_response = @orders_controller.orders_confirm(request) + assert_equal(200, order_api_response.status_code) + + teardown + end + + def teardown + @ui_flow_executor.reset_browser_session + end + +end \ No newline at end of file diff --git a/test/flows/tests/test_patch_order_flow.rb b/test/flows/tests/test_patch_order_flow.rb new file mode 100644 index 0000000..f96a221 --- /dev/null +++ b/test/flows/tests/test_patch_order_flow.rb @@ -0,0 +1,100 @@ +require_relative '../flow_test_base' +require 'securerandom' + +class PatchOrderFlowTest < FlowTestBase + + def setup + setup_class + @orders_controller = @client.orders + @payments_controller = @client.payments + end + + def test_patch_order_flow + guid = SecureRandom.uuid + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::CAPTURE, + purchase_units: [ + PurchaseUnitRequest.new( + amount: AmountWithBreakdown.new( + currency_code: 'USD', + value: '10.00', + breakdown: AmountBreakdown.new( + item_total: Money.new(currency_code: 'USD', value: '10.0'), + shipping: Money.new(currency_code: 'USD', value: '0.0'), + tax_total: Money.new(currency_code: 'USD', value: '0')) + ), + description: 'Camera Shop', + items: [ + Item.new( + name: 'Levis 501 Selvedge STF', + unit_amount: Money.new(currency_code: 'USD', value: '5.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '5158936'), + Item.new( + name: 'T-Shirt', + unit_amount: Money.new(currency_code: 'USD', value: '5.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '1457432') + ], + shipping: ShippingDetails.new( + address: Address.new( + country_code: 'US', + address_line_1: '123 Main Street', + admin_area_1: 'CA', + admin_area_2: 'San Jose', + postal_code: '95131')) + ) + ], + payment_source: PaymentSource.new( + paypal: PayPalWallet.new( + experience_context: PayPalWalletExperienceContext.new( + locale: 'en-US', + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl'))) + ), + 'pay_pal_request_id' => guid, + 'pay_pal_partner_attribution_id' => 'PayPal-Partner-Attribution-Id', + 'pay_pal_client_metadata_id' => 'PayPal-Client-Metadata-Id', + 'prefer' => 'return=representation' + } + + order_api_response = @orders_controller.orders_create(request) + assert_equal(200, order_api_response.status_code) + + current_path = @ui_flow_executor.complete_payment(url: order_api_response.data.links.at(1).href) + assert_equal '/returnUrl', current_path + + request = { + 'id' => order_api_response.data.id, + 'body' => [ + Patch.new( + op: PatchOp::REPLACE, + path: "/purchase_units/@reference_id=='default'/shipping/address", + value: { + 'address_line_1' => '1234 Main St', + 'address_line_2' => 'Floor 6', + 'admin_area_1' => 'CA', + 'admin_area_2' => 'San Francisco', + 'postal_code' => '94107', + 'country_code' => 'US' + }) + ] + } + + patched_order_api_response = @orders_controller.orders_patch(request) + assert_equal(204, patched_order_api_response.status_code) + + order_api_response = @orders_controller.orders_get({'id' => order_api_response.data.id}) + assert_equal(200, order_api_response.status_code) + assert_equal('1234 Main St', order_api_response.data.purchase_units.at(0).shipping.address.address_line_1) + teardown + end + + def teardown + @ui_flow_executor.reset_browser_session + end + +end \ No newline at end of file diff --git a/test/flows/tests/test_payment_method_with_purchase_flow.rb b/test/flows/tests/test_payment_method_with_purchase_flow.rb new file mode 100644 index 0000000..c596603 --- /dev/null +++ b/test/flows/tests/test_payment_method_with_purchase_flow.rb @@ -0,0 +1,82 @@ +require_relative '../flow_test_base' +require 'securerandom' + +class PaymentMethodWithPurchaseFlowTest < FlowTestBase + + def setup + setup_class + @orders_controller = @client.orders + end + + def test_payment_method_with_purchase_flow + guid = SecureRandom.uuid + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::CAPTURE, + purchase_units: [ + PurchaseUnitRequest.new( + amount: AmountWithBreakdown.new( + currency_code: 'USD', + value: '10.00', + breakdown: AmountBreakdown.new( + item_total: Money.new(currency_code: 'USD', value: '10.0'), + shipping: Money.new(currency_code: 'USD', value: '0.0'), + tax_total: Money.new(currency_code: 'USD', value: '0')) + ), + description: 'Camera Shop', + items: [ + Item.new( + name: 'Levis 501 Selvedge STF', + unit_amount: Money.new(currency_code: 'USD', value: '5.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '5158936'), + Item.new( + name: 'T-Shirt', + unit_amount: Money.new(currency_code: 'USD', value: '5.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '1457432') + ], + shipping: ShippingDetails.new( + address: Address.new( + country_code: 'US', + address_line_1: '123 Main Street', + admin_area_1: 'CA', + admin_area_2: 'San Jose', + postal_code: '95131')) + ) + ], + payment_source: PaymentSource.new( + paypal: PayPalWallet.new( + experience_context: PayPalWalletExperienceContext.new( + locale: 'en-US', + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl'))) + ), + 'pay_pal_request_id' => guid, + 'pay_pal_partner_attribution_id' => 'PayPal-Partner-Attribution-Id', + 'pay_pal_client_metadata_id' => 'PayPal-Client-Metadata-Id', + 'prefer' => 'return=representation' + } + + order_api_response = @orders_controller.orders_create(request) + assert_equal(200, order_api_response.status_code) + + current_path = @ui_flow_executor.complete_payment(url: order_api_response.data.links.at(1).href) + assert_equal '/returnUrl', current_path + + request = { + 'id' => order_api_response.data.id, + 'prefer' => 'return=representation' + } + captured_order_api_response = @orders_controller.orders_capture(request) + assert_equal(201, captured_order_api_response.status_code) + + teardown + end + + def teardown + @ui_flow_executor.reset_browser_session + end +end diff --git a/test/flows/tests/test_payment_method_without_purchase_flow.rb b/test/flows/tests/test_payment_method_without_purchase_flow.rb new file mode 100644 index 0000000..53926dc --- /dev/null +++ b/test/flows/tests/test_payment_method_without_purchase_flow.rb @@ -0,0 +1,88 @@ +require_relative '../flow_test_base' +require 'securerandom' + +class PaymentMethodWithoutPurchaseFlowTest < FlowTestBase + + def setup + setup_class + @orders_controller = @client.orders + @vault_controller = @client.vault + end + + def test_payment_method_without_purchase_flow + guid = SecureRandom.uuid + request = { + 'pay_pal_request_id' => guid, + 'body' => SetupTokenRequest.new( + payment_source: SetupTokenRequestPaymentSource.new( + paypal: VaultPayPalWalletRequest.new( + description: "Description for PayPal to be shown to PayPal payer", + permit_multiple_payment_tokens: true, + usage_type: 'MERCHANT', + customer_type: 'CONSUMER', + experience_context: VaultExperienceContext.new( + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl')))) + } + + setup_token_api_response = @vault_controller.setup_tokens_create(request) + assert_equal(201, setup_token_api_response.status_code) + + current_path = @ui_flow_executor.save_payment_method( + url: setup_token_api_response.data.links.at(1).href) + assert_equal '/returnUrl', current_path + + request = { + 'pay_pal_request_id' => guid, + 'body' => PaymentTokenRequest.new( + payment_source: PaymentTokenRequestPaymentSource.new( + token: VaultTokenRequest.new( + id: setup_token_api_response.data.id, + type: TokenRequestType::SETUP_TOKEN + ) + ) + ) + } + payment_token_api_response = @vault_controller.payment_tokens_create(request) + assert_equal(201, payment_token_api_response.status_code) + + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::CAPTURE, + purchase_units: [ + PurchaseUnitRequest.new( + amount: AmountWithBreakdown.new( + currency_code: 'USD', + value: '10.00' + ) + ) + ], + payment_source: PaymentSource.new( + paypal: PayPalWallet.new( + vault_id: payment_token_api_response.data.id + ) + ) + ), + 'pay_pal_request_id' => guid, + 'prefer' => 'return=representation' + } + + order_api_response = @orders_controller.orders_create(request) + assert_equal(201, order_api_response.status_code) + + + setup_token_api_response = @vault_controller.setup_tokens_get(setup_token_api_response.data.id) + assert_equal(200, setup_token_api_response.status_code) + assert_equal('VAULTED', setup_token_api_response.data.status) + + payment_token_api_response = @vault_controller.payment_tokens_get(payment_token_api_response.data.id) + assert_equal(200, payment_token_api_response.status_code) + refute_nil(payment_token_api_response) + + teardown + end + + def teardown + @ui_flow_executor.reset_browser_session + end +end diff --git a/test/flows/tests/test_refund_flow.rb b/test/flows/tests/test_refund_flow.rb new file mode 100644 index 0000000..804fa1e --- /dev/null +++ b/test/flows/tests/test_refund_flow.rb @@ -0,0 +1,76 @@ +require_relative '../flow_test_base' +require 'securerandom' + +class RefundFlowTest < FlowTestBase + + def setup + setup_class + @orders_controller = @client.orders + @payments_controller = @client.payments + end + + def test_refund_flow + guid = SecureRandom.uuid + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::CAPTURE, + purchase_units: [ + PurchaseUnitRequest.new( + amount: AmountWithBreakdown.new( + currency_code: 'USD', + value: '100.00' + ), + reference_id: 'd9f80740-38f0-11e8-b467-0ed5f89f718b' + ) + ], + payment_source: PaymentSource.new( + paypal: PayPalWallet.new( + experience_context: PayPalWalletExperienceContext.new( + locale: 'en-US', + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl', + landing_page: PayPalExperienceLandingPage::LOGIN)) + ) + ), + 'pay_pal_request_id' => guid, + 'pay_pal_partner_attribution_id' => 'PayPal-Partner-Attribution-Id', + 'pay_pal_client_metadata_id' => 'PayPal-Client-Metadata-Id', + 'prefer' => 'return=representation' + } + + order_api_response = @orders_controller.orders_create(request) + assert_equal(200, order_api_response.status_code) + + current_path = @ui_flow_executor.complete_payment(url: order_api_response.data.links.at(1).href) + assert_equal '/returnUrl', current_path + + request = { + 'id' => order_api_response.data.id, + 'prefer' => 'return=representation' + } + captured_order_api_response = @orders_controller.orders_capture(request) + assert_equal(201, captured_order_api_response.status_code) + + request = { + 'capture_id' => captured_order_api_response.data.purchase_units.at(0) + .payments.captures.at(0).id, + 'pay_pal_request_id' => guid, + 'prefer' => 'return=representation' + } + + refund_api_response = @payments_controller.captures_refund(request) + assert_equal(201, refund_api_response.status_code) + + + refund_api_response = @payments_controller.refunds_get(refund_api_response.data.id) + assert_equal(200, refund_api_response.status_code) + assert_equal(RefundStatus::COMPLETED, refund_api_response.data.status) + + teardown + end + + def teardown + @ui_flow_executor.reset_browser_session + end + +end \ No newline at end of file diff --git a/test/flows/tests/test_secure_3d_authentication_multi_step_flow.rb b/test/flows/tests/test_secure_3d_authentication_multi_step_flow.rb new file mode 100644 index 0000000..88828e2 --- /dev/null +++ b/test/flows/tests/test_secure_3d_authentication_multi_step_flow.rb @@ -0,0 +1,105 @@ +require_relative '../flow_test_base' +require 'securerandom' + +class Secure3DAuthenticationMultiStepFlowTest < FlowTestBase + + def setup + setup_class + @orders_controller = @client.orders + end + + def test_secure_3d_authentication_multi_step + guid = SecureRandom.uuid + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::CAPTURE, + purchase_units: [ + PurchaseUnitRequest.new( + amount: AmountWithBreakdown.new( + currency_code: 'USD', + value: '10.00', + breakdown: AmountBreakdown.new( + item_total: Money.new(currency_code: 'USD', value: '10.0')) + ), + description: 'Camera Shop', + custom_id: 'testcustom_id', + invoice_id: "invoic_number#{guid}", + items: [ + Item.new(name: 'Levis 501 Selvedge STF', + unit_amount: Money.new(currency_code: 'USD', value: '5.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '5158936'), + Item.new(name: 'T-Shirt', + unit_amount: Money.new(currency_code: 'USD', value: '5.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '1457432') + ] + ) + ] + ), + 'pay_pal_request_id' => guid, + 'pay_pal_partner_attribution_id' => 'PayPal-Partner-Attribution-Id', + 'pay_pal_client_metadata_id' => 'PayPal-Client-Metadata-Id', + 'prefer' => 'return=representation' + } + + order_api_response = @orders_controller.orders_create(request) + assert_equal(201, order_api_response.status_code) + + request = { + 'id' => order_api_response.data.id, + 'prefer' => 'return=representation', + 'pay_pal_request_id' => guid, + 'pay_pal_client_metadata_id' => 'PayPal-Client-Metadata-Id', + 'body' => OrderCaptureRequest.new( + payment_source: OrderCaptureRequestPaymentSource.new( + card: CardRequest.new( + name: 'John Doe', + number: '4868719460707704', + expiry: '2027-02', + billing_address: Address.new( + country_code: 'US', + address_line_1: '2211 N First Street', + admin_area_1: 'CA', + admin_area_2: 'San Jose', + postal_code: '95131'), + attributes: CardAttributes.new( + verification: CardVerification.new( + method: CardVerificationMethod::SCA_ALWAYS)), + experience_context: CardExperienceContext.new( + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl')) + ) + ) + } + exception = assert_raises ErrorException do + @orders_controller.orders_capture(request) + end + + assert_equal(422, exception.response_code) + + current_path = @ui_flow_executor.complete_helios_verification(url: exception.links.at(0).href, + submit_verification_form: false) + assert_equal '/returnUrl', current_path + + request = { + 'id' => order_api_response.data.id, + 'prefer' => 'return=representation' + } + captured_order_api_response = @orders_controller.orders_capture(request) + assert_equal(201, captured_order_api_response.status_code) + + order_api_response = @orders_controller.orders_get({'id' => order_api_response.data.id}) + assert_equal(200, order_api_response.status_code) + refute_nil(order_api_response.data.payment_source) + assert_equal(OrderStatus::COMPLETED, order_api_response.data.status) + teardown + end + + def teardown + @ui_flow_executor.reset_browser_session + end + +end \ No newline at end of file diff --git a/test/flows/tests/test_secure_3d_authentication_single_step_flow.rb b/test/flows/tests/test_secure_3d_authentication_single_step_flow.rb new file mode 100644 index 0000000..c95dc22 --- /dev/null +++ b/test/flows/tests/test_secure_3d_authentication_single_step_flow.rb @@ -0,0 +1,90 @@ +require_relative '../flow_test_base' +require 'securerandom' + +class Secure3DAuthenticationSingleStepFlowTest < FlowTestBase + + def setup + setup_class + @orders_controller = @client.orders + end + + def test_secure_3d_authentication_single_step + guid = SecureRandom.uuid + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::CAPTURE, + purchase_units: [ + PurchaseUnitRequest.new( + amount: AmountWithBreakdown.new( + currency_code: 'USD', + value: '10.00', + breakdown: AmountBreakdown.new( + item_total: Money.new(currency_code: 'USD', value: '10.0')) + ), + description: 'Camera Shop', + custom_id: 'testcustom_id', + invoice_id: "invoic_number#{guid}", + items: [ + Item.new(name: 'Levis 501 Selvedge STF', + unit_amount: Money.new(currency_code: 'USD', value: '5.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '5158936'), + Item.new(name: 'T-Shirt', + unit_amount: Money.new(currency_code: 'USD', value: '5.00'), + quantity: '1', + tax: Money.new(currency_code: 'USD', value: '0.00'), + sku: '1457432') + ] + ) + ], + payment_source: PaymentSource.new( + card: CardRequest.new( + name: 'John Doe', + number: '4868719995056080', + expiry: '2027-02', + billing_address: Address.new( + country_code: 'US', + address_line_1: '2211 N First Street', + admin_area_1: 'CA', + admin_area_2: 'San Jose', + postal_code: '95131'), + attributes: CardAttributes.new( + verification: CardVerification.new( + method: CardVerificationMethod::SCA_ALWAYS)), + experience_context: CardExperienceContext.new( + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl') + ) + ) + ), + 'pay_pal_request_id' => guid, + 'pay_pal_partner_attribution_id' => 'PayPal-Partner-Attribution-Id', + 'pay_pal_client_metadata_id' => 'PayPal-Client-Metadata-Id', + 'prefer' => 'return=representation' + } + + order_api_response = @orders_controller.orders_create(request) + assert_equal(201, order_api_response.status_code) + + current_path = @ui_flow_executor.complete_helios_verification(url: order_api_response.data.links.at(1).href) + assert_equal '/returnUrl', current_path + + request = { + 'id' => order_api_response.data.id, + 'prefer' => 'return=representation' + } + captured_order_api_response = @orders_controller.orders_capture(request) + assert_equal(201, captured_order_api_response.status_code) + + order_api_response = @orders_controller.orders_get({'id' => order_api_response.data.id}) + assert_equal(200, order_api_response.status_code) + assert_equal(OrderStatus::COMPLETED, order_api_response.data.status) + teardown + end + + def teardown + @ui_flow_executor.reset_browser_session + end + +end \ No newline at end of file diff --git a/test/flows/tests/test_standard_checkout_flow.rb b/test/flows/tests/test_standard_checkout_flow.rb new file mode 100644 index 0000000..94bf34b --- /dev/null +++ b/test/flows/tests/test_standard_checkout_flow.rb @@ -0,0 +1,58 @@ +require_relative '../flow_test_base' +require 'securerandom' + +class StandardCheckoutFlowTest < FlowTestBase + + def setup + setup_class + @orders_controller = @client.orders + end + + def test_standard_checkout_flow + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::CAPTURE, + purchase_units: [ + PurchaseUnitRequest.new( + amount: AmountWithBreakdown.new( + currency_code: 'USD', + value: '100.00' + ), + reference_id: 'd9f80740-38f0-11e8-b467-0ed5f89f718b' + ) + ], + payment_source: PaymentSource.new( + paypal: PayPalWallet.new( + experience_context: PayPalWalletExperienceContext.new( + locale: 'en-US', + return_url: 'https://example.com/returnUrl', + cancel_url: 'https://example.com/cancelUrl', + landing_page: PayPalExperienceLandingPage::LOGIN)) + ) + ), + 'prefer' => 'return=representation' + } + + order_api_response = @orders_controller.orders_create(request) + assert_equal(200, order_api_response.status_code) + + current_path = @ui_flow_executor.complete_payment(url: order_api_response.data.links.at(1).href) + assert_equal '/returnUrl', current_path + + request = { + 'id' => order_api_response.data.id, + 'prefer' => 'return=representation' + } + captured_api_response = @orders_controller.orders_capture(request) + assert_equal(201, captured_api_response.status_code) + + order_api_response = @orders_controller.orders_get({'id' => order_api_response.data.id}) + assert_equal(200, order_api_response.status_code) + teardown + end + + def teardown + @ui_flow_executor.reset_browser_session + end + +end \ No newline at end of file diff --git a/test/flows/ui_flow_executor.rb b/test/flows/ui_flow_executor.rb new file mode 100644 index 0000000..bacdc72 --- /dev/null +++ b/test/flows/ui_flow_executor.rb @@ -0,0 +1,127 @@ +require 'selenium-webdriver' +require 'capybara/dsl' +require 'capybara/minitest' +require 'capybara/session/matchers' +require 'dotenv' + +class UIFlowExecutor + include Capybara::DSL + + def initialize + super + Capybara.register_driver :selenium_headless do |app| + options = Selenium::WebDriver::Firefox::Options.new + options.args << '--headless' + options.profile = Selenium::WebDriver::Firefox::Profile.new.tap do |profile| + # Increase memory limit for Firefox to avoid OUT_OF_MEMORY issue + profile['browser.cache.memory.capacity'] = 4096 # Set to 4GB + end + + Capybara::Selenium::Driver.new(app, browser: :firefox, options: options) + end + Capybara.default_max_wait_time = 10 + @driver = Capybara::Session.new(:selenium_headless) + @email = ENV['EMAIL'] + @password = ENV['PASSWORD'] + validate_email_and_password + end + + def complete_payment(url:, retry_attempts: 0) + begin + @driver.visit(url) + login + if @driver.has_button?('payment-submit-btn') + @driver.click_button('payment-submit-btn') + end + + if @driver.has_selector?("h1") + return @driver.current_path + end + rescue + if retry_attempts < 3 + complete_payment(url: url, retry_attempts: retry_attempts + 1) + end + end + end + + def save_payment_method(url:) + @driver.visit(url) + login + find_and_click_consent_button + if @driver.has_selector?("h1") + @driver.current_path + end + end + + def complete_helios_verification(url:, submit_verification_form: true) + @driver.visit(url) + if submit_verification_form + iframe = @driver.find('iframe[name="threedsIframeV2"]') + @driver.within_frame(iframe) do + @driver.within_frame do + @driver.find('input[type="text"]').set('1234') + @driver.find('input[type="submit"][value="SUBMIT"]').click + end + end + end + + if @driver.has_selector?("h1") + @driver.current_path + end + end + + def validate_email_and_password + if @email.nil? && @password.nil? + raise ArgumentError, "Both email and password are required." + elsif @email.nil? + raise ArgumentError, "Email is required." + elsif @password.nil? + raise ArgumentError, "Password is required." + end + end + + def reset_browser_session + @driver.reset_session! + @driver.quit + end + + private + def login + if @driver.has_field?('email') + @driver.fill_in('email', with: @email) + end + + if @driver.has_button?('btnNext') + @driver.click_button('btnNext') + end + + if @driver.has_field?('password') + @driver.fill_in('password', with: @password) + end + if @driver.has_button?('btnLogin') + @driver.click_button('btnLogin') + end + end + + def find_and_click_consent_button + max_attempts = 5 + attempts = 0 + page_loaded_successfully = false + + while !page_loaded_successfully && attempts < max_attempts + begin + @driver.click_button('consentButton') + if @driver.has_link?('Try again', exact: true) + @driver.find_link('Try again').click + attempts += 1 + next + end + page_loaded_successfully = @driver.has_selector?('h1') + rescue + @driver.go_back + attempts += 1 + end + end + end + +end diff --git a/test/unit_tests/controller_test_base.rb b/test/unit_tests/controller_test_base.rb new file mode 100644 index 0000000..5b93138 --- /dev/null +++ b/test/unit_tests/controller_test_base.rb @@ -0,0 +1,33 @@ +# paypal_server_sdk +# +# This file was automatically generated by APIMATIC v2.0 +# ( https://apimatic.io ). + +require 'json' +require 'minitest/autorun' +require 'minitest/hell' +require 'minitest/proveit' +require 'paypal_server_sdk' +require 'dotenv' + +class ControllerTestBase < Minitest::Test + include PaypalServerSdk + include CoreLibrary + Dotenv.load + + # Create configuration and set any test parameters + def create_configuration + Configuration.new(environment: Environment::SANDBOX, + client_credentials_auth_credentials: ClientCredentialsAuthCredentials.new( + o_auth_client_id: ENV['CLIENT_ID'], + o_auth_client_secret: ENV['CLIENT_SECRET'] + ) + ) + end + + # Initializes the base test controller + def setup_class + _config = create_configuration + @client = Client.new(config: _config) + end +end diff --git a/test/unit_tests/test_orders_controller.rb b/test/unit_tests/test_orders_controller.rb new file mode 100644 index 0000000..7f752c8 --- /dev/null +++ b/test/unit_tests/test_orders_controller.rb @@ -0,0 +1,158 @@ +# pay_pal_restap_is +# +# This file was automatically generated by APIMATIC v3.0 +# ( https://apimatic.io ). + +require_relative 'controller_test_base' + +class OrdersControllerTest < ControllerTestBase + + # Called only once for the class before any test has executed + def setup + setup_class + @controller = @client.orders + end + + def test_create_order_400_status_code + request = { + 'body' => OrderRequest.new( + intent: CheckoutPaymentIntent::CAPTURE, + purchase_units: [] + ), + 'pay_pal_request_id' => '', + 'pay_pal_partner_attribution_id' => 'PayPal-Partner-Attribution-Id', + 'pay_pal_client_metadata_id' => 'PayPal-Client-Metadata-Id', + 'prefer' => 'return=minimal' + } + + exception = assert_raises ErrorException do + @controller.orders_create(request) + end + + refute_nil(exception.response) + assert_equal(400, exception.response_code) + + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_patch_order_404_status_code + request = { + 'id' => 'id0', + 'body' => [ + Patch.new(op: PatchOp::ADD) + ] + } + exception = assert_raises ErrorException do + @controller.orders_patch(request) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_confirm_order_404_status_code + request = { + 'id' => 'id0', + 'body' => ConfirmOrderRequest.new( + payment_source: PaymentSource.new(paypal: PayPalWallet.new) + ), + 'prefer' => 'return=minimal' + } + exception = assert_raises ErrorException do + @controller.orders_confirm(request) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_authorize_order_404_status_code + request = { + 'id' => 'id0', + 'prefer' => 'return=minimal' + } + exception = assert_raises ErrorException do + @controller.orders_authorize(request) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_create_order_track_400_status_code + request = { + 'id' => 'id0', + 'body' => OrderTrackerRequest.new(capture_id: 'id0', notify_payer: false), + 'prefer' => 'return=minimal' + } + exception = assert_raises ErrorException do + @controller.orders_track_create(request) + end + + refute_nil(exception.response) + assert_equal(400, exception.response_code) + + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_patch_order_tracker_404_status_code + request = { + 'id' => 'id0', + 'tracker_id' => 'id0', + 'body' => [ + Patch.new( + op: PatchOp::REPLACE, + path: '/notify_payer', + value: true) + ] + } + exception = assert_raises ErrorException do + @controller.orders_trackers_patch(request) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_get_order_404_status_code + + exception = assert_raises ErrorException do + @controller.orders_get({ 'id' => 'id0' }) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + +end \ No newline at end of file diff --git a/test/unit_tests/test_payments_controller.rb b/test/unit_tests/test_payments_controller.rb new file mode 100644 index 0000000..9bca643 --- /dev/null +++ b/test/unit_tests/test_payments_controller.rb @@ -0,0 +1,150 @@ +# pay_pal_restap_is +# +# This file was automatically generated by APIMATIC v3.0 +# ( https://apimatic.io ). + +require_relative 'controller_test_base' + +class PaymentsControllerTest < ControllerTestBase + # Called only once for the class before any test has executed + def setup + setup_class + @controller = @client.payments + end + + def test_get_authorization_404_status_code + exception = assert_raises ErrorException do + @controller.authorizations_get('id0') + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json;charset=UTF-8' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_get_capture_refund_404_status_code + request = { + 'capture_id' => 'id0', + 'pay_pal_request_id' => '', + 'prefer' => 'return=minimal' + } + + exception = assert_raises ErrorException do + @controller.captures_refund(request) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_get_refund_request_404_status_code + exception = assert_raises ErrorException do + @controller.refunds_get('id0') + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_capture_authorization_404_status_code + request = { + 'authorization_id' => 'id0', + 'prefer' => 'return=minimal', + 'body' => CaptureRequest.new(final_capture: false) + } + + exception = assert_raises ErrorException do + @controller.authorizations_capture(request) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json;charset=UTF-8' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_reauthorization_404_status_code + request = { + 'authorization_id' => 'id0', + 'prefer' => 'return=minimal' + } + + exception = assert_raises ErrorException do + @controller.authorizations_reauthorize(request) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json;charset=UTF-8' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_authorization_void_404_status_code + request = { + 'authorization_id' => 'id0', + 'prefer' => 'return=minimal' + } + + exception = assert_raises ErrorException do + @controller.authorizations_void(request) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_capture_refund_404_status_code + request = { + 'capture_id' => 'id0', + 'pay_pal_request_id' => '', + 'prefer' => 'return=minimal', + 'body' => RefundRequest.new( + amount: Money.new(currency_code: 'USD', value: '1.44'), + note_to_payer: 'Defective product') + } + + exception = assert_raises ErrorException do + @controller.captures_refund(request) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end +end \ No newline at end of file diff --git a/test/unit_tests/test_vault_controller.rb b/test/unit_tests/test_vault_controller.rb new file mode 100644 index 0000000..f65e69f --- /dev/null +++ b/test/unit_tests/test_vault_controller.rb @@ -0,0 +1,186 @@ +# pay_pal_restap_is +# +# This file was automatically generated by APIMATIC v3.0 +# ( https://apimatic.io ). + +require_relative 'controller_test_base' + +class VaultControllerTest < ControllerTestBase + # Called only once for the class before any test has executed + def setup + setup_class + @controller = @client.vault + end + + def test_create_setup_token_400_status_code + request = { + 'pay_pal_request_id' => '', + 'body' => SetupTokenRequest.new(payment_source: SetupTokenRequestPaymentSource.new) + } + exception = assert_raises ErrorException do + @controller.setup_tokens_create(request) + end + + refute_nil(exception.response) + assert_equal(400, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_create_payment_token_404_status_code + request = { + 'pay_pal_request_id' => '', + 'body' => PaymentTokenRequest.new(payment_source: PaymentTokenRequestPaymentSource.new) + } + exception = assert_raises ErrorException do + @controller.payment_tokens_create(request) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_create_payment_token_400_status_code + request = { + 'pay_pal_request_id' => '', + 'body' => PaymentTokenRequest.new( + payment_source: PaymentTokenRequestPaymentSource.new( + token: VaultTokenRequest.new(id: 'id0', type: TokenRequestType::BILLING_AGREEMENT) + ) + ) + } + exception = assert_raises ErrorException do + @controller.payment_tokens_create(request) + end + + refute_nil(exception.response) + assert_equal(400, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_get_setup_token_400_status_code + exception = assert_raises APIException do + @controller.setup_tokens_get('\'id0') + end + + refute_nil(exception.response) + assert_equal(400, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_get_setup_token_404_status_code + exception = assert_raises APIException do + @controller.setup_tokens_get('payment-1') + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_get_payment_token_400_status_code + exception = assert_raises APIException do + @controller.payment_tokens_get("'dw") + end + + refute_nil(exception.response) + assert_equal(400, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_get_payment_token_404_status_code + exception = assert_raises APIException do + @controller.payment_tokens_get('payment-1') + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_get_customer_payment_token_404_status_code + request = { + 'customer_id' => 'customer-1', + 'page_size' => 5, + 'page' => 1, + 'total_required' => false + } + + exception = assert_raises APIException do + @controller.customer_payment_tokens_get(request) + end + + refute_nil(exception.response) + assert_equal(404, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_get_customer_payment_token_400_status_code + request = { + 'customer_id' => "'dw", + 'page_size' => 5, + 'page' => 1, + 'total_required' => false + } + + exception = assert_raises ErrorException do + @controller.customer_payment_tokens_get(request) + end + + refute_nil(exception.response) + assert_equal(400, exception.response_code) + + # Test headers + expected_headers = {} + expected_headers['content-type'] = 'application/json' + + assert(ComparisonHelper.match_headers(expected_headers, exception.response.headers)) + end + + def test_delete_payment_token_204_status_code + api_response = @controller.payment_tokens_delete('payment-1') + + refute_nil(api_response) + assert_equal(204, api_response.status_code) + end +end \ No newline at end of file