workarea-paypal 2.0.12 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.json +2 -1
  3. data/.gitignore +16 -11
  4. data/CHANGELOG.md +29 -5
  5. data/README.md +100 -6
  6. data/Rakefile +4 -5
  7. data/app/assets/javascripts/workarea/storefront/paypal/config.js.erb +44 -0
  8. data/app/assets/javascripts/workarea/storefront/paypal/modules/paypal_buttons.js +71 -0
  9. data/app/assets/javascripts/workarea/storefront/paypal/modules/paypal_hosted_fields.js +96 -0
  10. data/app/assets/javascripts/workarea/storefront/paypal/modules/update_checkout_submit_text.js +11 -5
  11. data/app/assets/javascripts/workarea/storefront/paypal/templates/paypal_fields.jst.ejs +43 -0
  12. data/app/controllers/workarea/storefront/checkout/place_order_controller.decorator +6 -4
  13. data/app/controllers/workarea/storefront/paypal_controller.rb +32 -26
  14. data/app/helpers/workarea/storefront/paypal_helper.rb +38 -0
  15. data/app/models/workarea/payment/authorize/paypal.rb +13 -13
  16. data/app/models/workarea/payment/capture/paypal.rb +10 -20
  17. data/app/models/workarea/payment/null_address.rb +37 -0
  18. data/app/models/workarea/payment/purchase/paypal.rb +1 -25
  19. data/app/models/workarea/payment/refund/paypal.rb +3 -6
  20. data/app/models/workarea/payment/tender/paypal.rb +14 -2
  21. data/app/models/workarea/payment.decorator +17 -3
  22. data/app/services/workarea/paypal/approve_order.rb +104 -0
  23. data/app/services/workarea/paypal/create_order.rb +177 -0
  24. data/app/services/workarea/paypal/update_order.rb +44 -0
  25. data/app/views/workarea/admin/orders/tenders/_paypal.html.haml +5 -2
  26. data/app/views/workarea/api/orders/tenders/_paypal.json.jbuilder +7 -1
  27. data/app/views/workarea/storefront/carts/_paypal_checkout.html.haml +6 -1
  28. data/app/views/workarea/storefront/checkouts/_paypal_payment.html.haml +16 -5
  29. data/app/views/workarea/storefront/order_mailer/tenders/_paypal.html.haml +5 -3
  30. data/app/views/workarea/storefront/orders/tenders/_paypal.html.haml +9 -2
  31. data/app/views/workarea/storefront/paypal/_paypal_sdk.html.haml +1 -0
  32. data/app/workers/workarea/paypal/handle_webhook_event.rb +64 -0
  33. data/config/initializers/append_points.rb +17 -5
  34. data/config/initializers/fields.rb +27 -0
  35. data/config/initializers/workarea.rb +41 -5
  36. data/config/locales/en.yml +14 -4
  37. data/config/routes.rb +3 -2
  38. data/lib/tasks/workarea/create_webhooks.rake +28 -0
  39. data/lib/workarea/paypal/engine.rb +4 -0
  40. data/lib/workarea/paypal/gateway.rb +200 -0
  41. data/lib/workarea/paypal/requests/create_webhook.rb +21 -0
  42. data/lib/workarea/paypal/requests/delete_webhook.rb +17 -0
  43. data/lib/workarea/paypal/requests/generate_token.rb +21 -0
  44. data/lib/workarea/paypal/requests/list_webhooks.rb +17 -0
  45. data/lib/workarea/paypal/version.rb +1 -1
  46. data/lib/workarea/paypal.rb +22 -19
  47. data/package.json +9 -0
  48. data/test/dummy/config/initializers/workarea.rb +1 -1
  49. data/test/factories/workarea/capture_completed_webhook.json +70 -0
  50. data/test/factories/workarea/capture_denied_webhook.json +68 -0
  51. data/test/factories/workarea/paypal.rb +34 -0
  52. data/test/helpers/workarea/storefront/paypal_helper_test.rb +35 -0
  53. data/test/integration/workarea/storefront/papyal_place_order_integration_test.rb +42 -0
  54. data/test/integration/workarea/storefront/paypal_integration_test.rb +104 -294
  55. data/test/lib/workarea/paypal/gateway_test.rb +236 -0
  56. data/test/models/workarea/payment/authorize/paypal_test.rb +57 -46
  57. data/test/models/workarea/payment/capture/paypal_test.rb +9 -51
  58. data/test/models/workarea/payment/null_address_test.rb +53 -0
  59. data/test/models/workarea/payment/refund/paypal_test.rb +39 -38
  60. data/test/models/workarea/paypal_payment_test.rb +65 -0
  61. data/test/models/workarea/search/paypal_order_text_test.rb +14 -0
  62. data/test/services/workarea/paypal/approve_order_test.rb +35 -0
  63. data/test/services/workarea/paypal/create_order_test.rb +127 -0
  64. data/test/services/workarea/paypal/update_order_test.rb +73 -0
  65. data/test/support/workarea/paypal_setup.rb +49 -0
  66. data/test/system/workarea/storefront/cart_system_test.decorator +1 -1
  67. data/test/system/workarea/storefront/logged_in_checkout_system_test.decorator +1 -1
  68. data/test/vcr_cassettes/paypal_approve_order.yml +106 -0
  69. data/test/vcr_cassettes/paypal_create_order.yml +110 -0
  70. data/test/vcr_cassettes/paypal_gateway_create_order.yml +105 -0
  71. data/test/vcr_cassettes/paypal_gateway_generate_token.yml +103 -0
  72. data/test/vcr_cassettes/paypal_gateway_get_order.yml +103 -0
  73. data/test/vcr_cassettes/paypal_gateway_update_order.yml +199 -0
  74. data/test/vcr_cassettes/paypal_gateway_webhooks.yml +403 -0
  75. data/test/vcr_cassettes/paypal_update_order.yml +204 -0
  76. data/test/workers/workarea/paypal/handle_webhook_event_test.rb +60 -0
  77. data/workarea-paypal.gemspec +2 -1
  78. metadata +64 -16
  79. data/app/services/workarea/paypal/setup.rb +0 -114
  80. data/app/services/workarea/paypal/update.rb +0 -69
  81. data/app/views/workarea/storefront/checkouts/_paypal_error.html.haml +0 -6
  82. data/app/views/workarea/storefront/order_mailer/tenders/_paypal.text.haml +0 -2
  83. data/lib/workarea/paypal/ext/active_merchant/paypal_express_gateway.rb +0 -9
  84. data/test/dummy/config/initializers/session_store.rb +0 -3
  85. data/test/integration/workarea/storefront/place_order_integration_test.decorator +0 -11
  86. data/test/models/workarea/payment/purchase/paypal_test.rb +0 -94
  87. data/test/models/workarea/payment_test.decorator +0 -34
  88. data/test/models/workarea/search/admin/order_test.decorator +0 -32
  89. data/test/services/workarea/paypal/setup_test.rb +0 -120
  90. data/test/services/workarea/paypal/update_test.rb +0 -221
  91. data/test/workarea/paypal/ext/active_merchant/paypal_express_gateway_test.rb +0 -17
@@ -0,0 +1,70 @@
1
+ {
2
+ "id": "WH-58D329510W468432D-8HN650336L201105X",
3
+ "event_version": "1.0",
4
+ "create_time": "2019-02-14T21:50:07.940Z",
5
+ "resource_type": "capture",
6
+ "resource_version": "2.0",
7
+ "event_type": "PAYMENT.CAPTURE.COMPLETED",
8
+ "summary": "Payment completed for $ 5.00 USD",
9
+ "resource": {
10
+ "id": "CAPTURE001",
11
+ "amount": {
12
+ "currency_code": "USD",
13
+ "value": "5.00"
14
+ },
15
+ "final_capture": true,
16
+ "seller_protection": {
17
+ "status": "ELIGIBLE",
18
+ "dispute_categories": [
19
+ "ITEM_NOT_RECEIVED",
20
+ "UNAUTHORIZED_TRANSACTION"
21
+ ]
22
+ },
23
+ "seller_receivable_breakdown": {
24
+ "gross_amount": {
25
+ "currency_code": "USD",
26
+ "value": "5.00"
27
+ },
28
+ "paypal_fee": {
29
+ "currency_code": "USD",
30
+ "value": "0.73"
31
+ },
32
+ "net_amount": {
33
+ "currency_code": "USD",
34
+ "value": "4.27"
35
+ }
36
+ },
37
+ "status": "COMPLETED",
38
+ "create_time": "2019-02-14T21:49:58Z",
39
+ "update_time": "2019-02-14T21:49:58Z",
40
+ "links": [
41
+ {
42
+ "href": "https://api.paypal.com/v2/payments/captures/CAPTURE001",
43
+ "rel": "self",
44
+ "method": "GET"
45
+ },
46
+ {
47
+ "href": "https://api.paypal.com/v2/payments/captures/CAPTURE001/refund",
48
+ "rel": "refund",
49
+ "method": "POST"
50
+ },
51
+ {
52
+ "href": "https://api.paypal.com/v2/payments/authorizations/7W5147081L658180V",
53
+ "rel": "up",
54
+ "method": "GET"
55
+ }
56
+ ]
57
+ },
58
+ "links": [
59
+ {
60
+ "href": "https://api.paypal.com/v1/notifications/webhooks-events/WH-58D329510W468432D-8HN650336L201105X",
61
+ "rel": "self",
62
+ "method": "GET"
63
+ },
64
+ {
65
+ "href": "https://api.paypal.com/v1/notifications/webhooks-events/WH-58D329510W468432D-8HN650336L201105X/resend",
66
+ "rel": "resend",
67
+ "method": "POST"
68
+ }
69
+ ]
70
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "id": "WH-4SW78779LY2325805-07E03580SX1414828",
3
+ "create_time": "2019-02-14T22:20:08.370Z",
4
+ "resource_type": "capture",
5
+ "event_type": "PAYMENT.CAPTURE.DENIED",
6
+ "summary": "A USD 5.00 USD capture payment was denied",
7
+ "resource": {
8
+ "amount": {
9
+ "currency_code": "USD",
10
+ "value": "5.00"
11
+ },
12
+ "seller_protection": {
13
+ "status": "ELIGIBLE",
14
+ "dispute_categories": [
15
+ "ITEM_NOT_RECEIVED",
16
+ "UNAUTHORIZED_TRANSACTION"
17
+ ]
18
+ },
19
+ "update_time": "2019-02-14T22:20:01Z",
20
+ "create_time": "2019-02-14T22:18:14Z",
21
+ "final_capture": true,
22
+ "seller_receivable_breakdown": {
23
+ "gross_amount": {
24
+ "currency_code": "USD",
25
+ "value": "5.00"
26
+ },
27
+ "net_amount": {
28
+ "currency_code": "USD",
29
+ "value": "5.00"
30
+ }
31
+ },
32
+ "links": [
33
+ {
34
+ "href": "https://api.paypal.com/v2/payments/captures/CAPTURE001",
35
+ "rel": "self",
36
+ "method": "GET"
37
+ },
38
+ {
39
+ "href": "https://api.paypal.com/v2/payments/captures/CAPTURE001/refund",
40
+ "rel": "refund",
41
+ "method": "POST"
42
+ },
43
+ {
44
+ "href": "https://api.paypal.com/v2/payments/authorizations/2W543679LP5841156",
45
+ "rel": "up",
46
+ "method": "GET"
47
+ }
48
+ ],
49
+ "id": "CAPTURE001",
50
+ "status": "DECLINED"
51
+ },
52
+ "links": [
53
+ {
54
+ "href": "https://api.paypal.com/v1/notifications/webhooks-events/WH-4SW78779LY2325805-07E03580SX1414828",
55
+ "rel": "self",
56
+ "method": "GET",
57
+ "encType": "application/json"
58
+ },
59
+ {
60
+ "href": "https://api.paypal.com/v1/notifications/webhooks-events/WH-4SW78779LY2325805-07E03580SX1414828/resend",
61
+ "rel": "resend",
62
+ "method": "POST",
63
+ "encType": "application/json"
64
+ }
65
+ ],
66
+ "event_version": "1.0",
67
+ "resource_version": "2.0"
68
+ }
@@ -0,0 +1,34 @@
1
+
2
+ module Workarea
3
+ module Factories
4
+ module Paypal
5
+ Factories.add(self)
6
+
7
+ def webhook_capture_completed_payload
8
+ JSON.parse(File.read(webhook_capture_completed_path))
9
+ end
10
+
11
+ def webhook_capture_completed_path
12
+ Workarea::Paypal::Engine.root.join(
13
+ 'test',
14
+ 'factories',
15
+ 'workarea',
16
+ 'capture_completed_webhook.json'
17
+ )
18
+ end
19
+
20
+ def webhook_capture_denied_payload
21
+ JSON.parse(File.read(webhook_capture_denied_path))
22
+ end
23
+
24
+ def webhook_capture_denied_path
25
+ Workarea::Paypal::Engine.root.join(
26
+ 'test',
27
+ 'factories',
28
+ 'workarea',
29
+ 'capture_denied_webhook.json'
30
+ )
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,35 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Storefront
5
+ class PaypalHelperTest < ViewTest
6
+ include PaypalSetup
7
+
8
+ def test_include_paypal_javascript_tag
9
+ Workarea.config.paypal_sdk_params = {
10
+ commit: false,
11
+ debug: true
12
+ }
13
+
14
+ result = include_paypal_javascript_tag
15
+ assert_includes(result, 'commit=false')
16
+ assert_includes(result, 'debug=true')
17
+ assert_includes(result, "client-id=#{Workarea::Paypal.gateway.client_id}")
18
+ assert_includes(result, 'components=buttons')
19
+ assert_includes(result, 'data-partner-attribution-id="Workarea_SP_PCP"')
20
+ refute_includes(result, 'hosted-fields')
21
+ refute_includes(result, 'data-client-token')
22
+
23
+ Workarea.config.use_paypal_hosted_fields = true
24
+ result = include_paypal_javascript_tag(
25
+ params: { foo: 'bar' },
26
+ data: { baz: 'qux' }
27
+ )
28
+
29
+ assert_includes(result, 'foo=bar')
30
+ assert_includes(result, 'data-baz="qux"')
31
+ assert_includes(result, 'components=buttons%2Chosted-fields')
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,42 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Storefront
5
+ class PaypalPlaceOrderIntegrationTest < Workarea::IntegrationTest
6
+ def test_place_order_with_paypal
7
+ product = create_product(variants: [{ sku: 'SKU1', regular: 5.to_m }])
8
+
9
+ post storefront.cart_items_path, params: {
10
+ product_id: product.id,
11
+ sku: product.skus.first,
12
+ quantity: 2
13
+ }
14
+
15
+ patch storefront.checkout_addresses_path,
16
+ params: {
17
+ email: 'test@workarea.com',
18
+ billing_address: factory_defaults(:billing_address),
19
+ shipping_address: factory_defaults(:shipping_address)
20
+ }
21
+
22
+ patch storefront.checkout_place_order_path, params: { payment: 'paypal' }
23
+ assert_redirected_to(storefront.checkout_payment_path)
24
+ assert_equal(t('workarea.storefront.paypal.errors.place_order'), flash[:info])
25
+
26
+ Paypal::UpdateOrder.any_instance.expects(:perform).returns(true)
27
+ Workarea::Checkout.any_instance.stubs(:place_order).returns(true)
28
+
29
+ jar = ActionDispatch::Cookies::CookieJar.build(request, cookies.to_hash)
30
+ payment = Workarea::Payment.find_or_create_by(id: jar.signed[:order_id])
31
+ payment.set_paypal(
32
+ paypal_id: '123',
33
+ payer_id: 'abc',
34
+ approved: true
35
+ )
36
+
37
+ patch storefront.checkout_place_order_path, params: { payment: 'paypal' }
38
+ assert_redirected_to(storefront.checkout_confirmation_path)
39
+ end
40
+ end
41
+ end
42
+ end