workarea-listrak 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. checksums.yaml +7 -0
  2. data/.eslintrc.json +36 -0
  3. data/.esvmrc +5 -0
  4. data/.gitignore +32 -0
  5. data/CHANGELOG.md +322 -0
  6. data/Gemfile +14 -0
  7. data/README.md +130 -0
  8. data/Rakefile +53 -0
  9. data/app/assets/javascripts/workarea/admin/modules/listrak/list_events_select.js +83 -0
  10. data/app/assets/javascripts/workarea/storefront/listrak/adapters/listrak_adapter.js +110 -0
  11. data/app/assets/javascripts/workarea/storefront/listrak/listrak_config.js.erb +13 -0
  12. data/app/assets/javascripts/workarea/storefront/listrak/modules/listrak.js +64 -0
  13. data/app/controllers/workarea/admin/listrak/configurations_controller.rb +30 -0
  14. data/app/controllers/workarea/admin/listrak/events_controller.rb +17 -0
  15. data/app/helpers/workarea/listrak/analytics/helper.rb +44 -0
  16. data/app/models/workarea/listrak/configuration.rb +19 -0
  17. data/app/queries/workarea/categorization.decorator +7 -0
  18. data/app/services/workarea/listrak/data_api/customers.rb +26 -0
  19. data/app/services/workarea/listrak/data_api/orders.rb +26 -0
  20. data/app/services/workarea/listrak/data_api/products.rb +26 -0
  21. data/app/services/workarea/listrak/data_api.rb +63 -0
  22. data/app/services/workarea/listrak/email_api/contacts.rb +73 -0
  23. data/app/services/workarea/listrak/email_api/events.rb +44 -0
  24. data/app/services/workarea/listrak/email_api/lists.rb +21 -0
  25. data/app/services/workarea/listrak/email_api/messages.rb +50 -0
  26. data/app/services/workarea/listrak/email_api/transactional_messages.rb +32 -0
  27. data/app/services/workarea/listrak/email_api.rb +71 -0
  28. data/app/services/workarea/listrak/models/address.rb +83 -0
  29. data/app/services/workarea/listrak/models/contact.rb +67 -0
  30. data/app/services/workarea/listrak/models/contact_form.rb +24 -0
  31. data/app/services/workarea/listrak/models/customer_form.rb +209 -0
  32. data/app/services/workarea/listrak/models/event.rb +45 -0
  33. data/app/services/workarea/listrak/models/event_form.rb +25 -0
  34. data/app/services/workarea/listrak/models/list.rb +204 -0
  35. data/app/services/workarea/listrak/models/message_form.rb +147 -0
  36. data/app/services/workarea/listrak/models/order_form.rb +352 -0
  37. data/app/services/workarea/listrak/models/order_item.rb +197 -0
  38. data/app/services/workarea/listrak/models/product_form.rb +369 -0
  39. data/app/services/workarea/listrak/models/transactional_message_form.rb +21 -0
  40. data/app/services/workarea/listrak/oauth.rb +45 -0
  41. data/app/services/workarea/listrak/transactional_message.rb +83 -0
  42. data/app/view_models/workarea/admin/listrak_configuration_view_model.rb +17 -0
  43. data/app/views/workarea/admin/listrak/configurations/edit.html.haml +28 -0
  44. data/app/views/workarea/admin/listrak/events/index.json.jbuilder +4 -0
  45. data/app/views/workarea/admin/shared/_listrak_configuration_link.html.haml +1 -0
  46. data/app/views/workarea/storefront/checkouts/_listrak.html.haml +2 -0
  47. data/app/workers/workarea/listrak/customer_exporter.rb +22 -0
  48. data/app/workers/workarea/listrak/order_exporter.rb +22 -0
  49. data/app/workers/workarea/listrak/product_exporter.rb +50 -0
  50. data/app/workers/workarea/listrak/subscribe_email_signup.rb +34 -0
  51. data/app/workers/workarea/listrak/unsubscribe_email_signup.rb +27 -0
  52. data/bin/rails +18 -0
  53. data/bin/rake +16 -0
  54. data/bin/rspec +16 -0
  55. data/bin/rubocop +16 -0
  56. data/config/initializers/append_points.rb +28 -0
  57. data/config/initializers/configuration.rb +8 -0
  58. data/config/locales/en.yml +17 -0
  59. data/config/routes.rb +10 -0
  60. data/docs/Listrak Technical Integration Guide.docx +0 -0
  61. data/lib/generators/workarea/listrak/message/USAGE +9 -0
  62. data/lib/generators/workarea/listrak/message/message_generator.rb +15 -0
  63. data/lib/generators/workarea/listrak/message/templates/message.rb.erb +24 -0
  64. data/lib/workarea/listrak/analytics.rb +17 -0
  65. data/lib/workarea/listrak/bogus_data_api/customers.rb +9 -0
  66. data/lib/workarea/listrak/bogus_data_api/orders.rb +9 -0
  67. data/lib/workarea/listrak/bogus_data_api/products.rb +9 -0
  68. data/lib/workarea/listrak/bogus_data_api/proxy_client.rb +29 -0
  69. data/lib/workarea/listrak/bogus_data_api.rb +46 -0
  70. data/lib/workarea/listrak/bogus_email_api/contacts.rb +8 -0
  71. data/lib/workarea/listrak/bogus_email_api/events.rb +23 -0
  72. data/lib/workarea/listrak/bogus_email_api/lists.rb +63 -0
  73. data/lib/workarea/listrak/bogus_email_api/proxy_client.rb +29 -0
  74. data/lib/workarea/listrak/bogus_email_api/transactional_messages.rb +9 -0
  75. data/lib/workarea/listrak/bogus_email_api.rb +51 -0
  76. data/lib/workarea/listrak/engine.rb +12 -0
  77. data/lib/workarea/listrak/error.rb +39 -0
  78. data/lib/workarea/listrak/version.rb +5 -0
  79. data/lib/workarea/listrak.rb +57 -0
  80. data/readme/listrak-admin.png +0 -0
  81. data/script/admin_ci +9 -0
  82. data/script/ci +11 -0
  83. data/script/core_ci +9 -0
  84. data/script/plugins_ci +9 -0
  85. data/script/storefront_ci +9 -0
  86. data/test/dummy/Rakefile +6 -0
  87. data/test/dummy/bin/bundle +3 -0
  88. data/test/dummy/bin/rails +4 -0
  89. data/test/dummy/bin/rake +4 -0
  90. data/test/dummy/bin/setup +34 -0
  91. data/test/dummy/bin/update +29 -0
  92. data/test/dummy/config/application.rb +18 -0
  93. data/test/dummy/config/boot.rb +5 -0
  94. data/test/dummy/config/cable.yml +9 -0
  95. data/test/dummy/config/environment.rb +5 -0
  96. data/test/dummy/config/environments/development.rb +54 -0
  97. data/test/dummy/config/environments/production.rb +86 -0
  98. data/test/dummy/config/environments/test.rb +43 -0
  99. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  100. data/test/dummy/config/initializers/assets.rb +11 -0
  101. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  102. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  103. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  104. data/test/dummy/config/initializers/inflections.rb +16 -0
  105. data/test/dummy/config/initializers/mime_types.rb +4 -0
  106. data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
  107. data/test/dummy/config/initializers/session_store.rb +3 -0
  108. data/test/dummy/config/initializers/workarea.rb +5 -0
  109. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  110. data/test/dummy/config/locales/en.yml +23 -0
  111. data/test/dummy/config/puma.rb +47 -0
  112. data/test/dummy/config/routes.rb +5 -0
  113. data/test/dummy/config/secrets.yml +38 -0
  114. data/test/dummy/config/spring.rb +6 -0
  115. data/test/dummy/config.ru +5 -0
  116. data/test/dummy/db/seeds.rb +2 -0
  117. data/test/dummy/public/404.html +67 -0
  118. data/test/dummy/public/422.html +67 -0
  119. data/test/dummy/public/500.html +66 -0
  120. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  121. data/test/dummy/public/apple-touch-icon.png +0 -0
  122. data/test/dummy/public/favicon.ico +0 -0
  123. data/test/factories/workarea/factories/listrak.rb +15 -0
  124. data/test/helpers/workarea/listrak/analytics/helper_test.rb +38 -0
  125. data/test/integration/workarea/admin/listrak/configuration_integration_test.rb +26 -0
  126. data/test/integration/workarea/admin/listrak/events_integration_test.rb +21 -0
  127. data/test/lib/generators/workarea/listrak/message_generator_test.rb +26 -0
  128. data/test/queries/workarea/categorization_test.decorator +15 -0
  129. data/test/services/workarea/listrak/data_api/customers_test.rb +35 -0
  130. data/test/services/workarea/listrak/data_api/orders_test.rb +24 -0
  131. data/test/services/workarea/listrak/data_api/products_test.rb +27 -0
  132. data/test/services/workarea/listrak/email_api/contacts_test.rb +55 -0
  133. data/test/services/workarea/listrak/email_api/events_test.rb +51 -0
  134. data/test/services/workarea/listrak/email_api/lists_test.rb +45 -0
  135. data/test/services/workarea/listrak/email_api/messages_test.rb +28 -0
  136. data/test/services/workarea/listrak/email_api/transactional_messages_test.rb +50 -0
  137. data/test/services/workarea/listrak/oauth_test.rb +27 -0
  138. data/test/services/workarea/listrak/transactional_message_test.rb +48 -0
  139. data/test/support/workarea/listrak/test_order_confirmation_email.rb +116 -0
  140. data/test/support/workarea/listrak/vcr_config.rb +31 -0
  141. data/test/system/workarea/listrak_system_test.rb +75 -0
  142. data/test/test_helper.rb +16 -0
  143. data/test/vcr_cassettes/listrak/data_api/customers_import-successful.yml +88 -0
  144. data/test/vcr_cassettes/listrak/data_api/orders_import-successful.yml +90 -0
  145. data/test/vcr_cassettes/listrak/data_api/products_import-successful.yml +88 -0
  146. data/test/vcr_cassettes/listrak/email_api/contacts_get-successful.yml +87 -0
  147. data/test/vcr_cassettes/listrak/email_api/contacts_upsert-already_unsubscribed.yml +90 -0
  148. data/test/vcr_cassettes/listrak/email_api/contacts_upsert-successful.yml +87 -0
  149. data/test/vcr_cassettes/listrak/email_api/events_create-invalid_parameter.yml +90 -0
  150. data/test/vcr_cassettes/listrak/email_api/events_create-successful.yml +87 -0
  151. data/test/vcr_cassettes/listrak/email_api/events_get-successful.yml +88 -0
  152. data/test/vcr_cassettes/listrak/email_api/lists_all-successful.yml +88 -0
  153. data/test/vcr_cassettes/listrak/email_api/messages_create-successful.yml +88 -0
  154. data/test/vcr_cassettes/listrak/email_api/transactional_messages_create-successful.yml +89 -0
  155. data/test/vcr_cassettes/listrak/oauth-successful.yml +44 -0
  156. data/test/vcr_cassettes/listrak/oauth-unsuccessful.yml +46 -0
  157. data/test/vcr_cassettes/listrak/system_tests/footer_email_signup-successful.yml +171 -0
  158. data/test/vcr_cassettes/listrak/system_tests/footer_email_signup_overrides_unsubscribe.yml +255 -0
  159. data/test/vcr_cassettes/listrak/system_tests/unsubscribing.yml +593 -0
  160. data/test/workers/workarea/listrak/order_exporter_test.rb +31 -0
  161. data/test/workers/workarea/listrak/product_exporter_test.rb +62 -0
  162. data/workarea-listrak.gemspec +16 -0
  163. metadata +223 -0
@@ -0,0 +1,51 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Listrak
5
+ class EmailApi::EventsTest < TestCase
6
+ def test_create
7
+ VCR.use_cassette 'listrak/email_api/events_create-successful' do
8
+ event = Listrak::Models::EventForm.new(
9
+ name: "footer signup"
10
+ )
11
+
12
+ response = email_api.events.create(349984, event)
13
+ assert response.present?
14
+ end
15
+ end
16
+
17
+ def test_create_invalid_parameter
18
+ VCR.use_cassette 'listrak/email_api/events_create-invalid_parameter' do
19
+ event = Listrak::Models::EventForm.new(
20
+ name: "footer signup"
21
+ )
22
+
23
+ error = assert_raises Workarea::Listrak::HttpError do
24
+ email_api.events.create(349984, event)
25
+ end
26
+
27
+ assert_equal "ERROR_INVALID_PARAMETER", error.error_code
28
+ assert_equal "An invalid value was supplied for eventName.", error.api_message
29
+ end
30
+ end
31
+
32
+ def test_all
33
+ VCR.use_cassette 'listrak/email_api/events_get-successful' do
34
+ events = email_api.events.all(349984)
35
+
36
+ assert_equal [12714, 12715], events.map(&:id)
37
+ assert_equal ["Test", "footer signup"], events.map(&:name)
38
+ assert_equal [0, 0], events.map(&:group_id)
39
+ assert_equal ["Active", "Active"], events.map(&:status)
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def email_api
46
+ @email_api ||= Listrak::EmailApi.new client_id: 'doyfni0aw64ogd84ld6t',
47
+ client_secret: 'LxdEE4Gu4aSJv5tS9osd8WudjGbJ+EIPYvZBS7bc5JU'
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Listrak
5
+ class EmailApi::ListsTest < TestCase
6
+ def test_all
7
+ VCR.use_cassette 'listrak/email_api/lists_all-successful' do
8
+ lists = email_api.lists.all
9
+ assert_equal 2, lists.size
10
+ assert_equal [349956, 349984], lists.map(&:id)
11
+ assert_equal ["My First List", "gem-testing"], lists.map(&:name)
12
+ assert_equal [0, 0], lists.map(&:folder_id)
13
+ assert_equal [11, 11], lists.map(&:ip_pool_id)
14
+ assert_equal ["", ""], lists.map(&:bounce_domain_alias)
15
+ assert_equal ["Standard", "Standard"], lists.map(&:bounce_handling)
16
+ assert_equal [5, 5], lists.map(&:bounce_unsubscribe_count)
17
+ assert_equal [DateTime.strptime("2015-08-31T16:02:41.65", "%FT%T"), DateTime.strptime("2015-09-02T14:42:38.91", "%FT%T")], lists.map(&:create_date)
18
+ assert_equal [false, false], lists.map(&:enable_browser_link)
19
+ assert_equal [false, false], lists.map(&:enable_double_opt_in)
20
+ assert_equal [false, false], lists.map(&:enable_dynamic_content)
21
+ assert_equal [false, false], lists.map(&:enable_google_analytics)
22
+ assert_equal [false, false], lists.map(&:enable_internationalization)
23
+ assert_equal [true, true], lists.map(&:enable_list_hygiene)
24
+ assert_equal [true, true], lists.map(&:enable_list_removal_header)
25
+ assert_equal [true, true], lists.map(&:enable_list_removal_link)
26
+ assert_equal [false, false], lists.map(&:enable_listrak_analytics)
27
+ assert_equal [false, false], lists.map(&:enable_spam_score_personalization)
28
+ assert_equal [false, false], lists.map(&:enable_to_name_personalization)
29
+ assert_equal ["", "mac@weblinc.com"], lists.map(&:from_email)
30
+ assert_equal ["", "WebLinc Developer"], lists.map(&:from_name)
31
+ assert_equal [[], []], lists.map(&:google_tracking_domains)
32
+ assert_equal ["", ""], lists.map(&:link_domain_alias)
33
+ assert_equal ["", ""], lists.map(&:media_domain_alias)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def email_api
40
+ @email_api ||= Listrak::EmailApi.new client_id: 'doyfni0aw64ogd84ld6t',
41
+ client_secret: 'LxdEE4Gu4aSJv5tS9osd8WudjGbJ+EIPYvZBS7bc5JU'
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,28 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Listrak
5
+ class EmailApi::MessagesTest < TestCase
6
+ def test_create
7
+ VCR.use_cassette 'listrak/email_api/messages_create-successful' do
8
+ message = Listrak::Models::MessageForm.new(
9
+ from_email: "plugins@workarea.com",
10
+ from_name: "Plugins @ Workarea.com",
11
+ subject: "Testing creating a message",
12
+ body_html: "This is the body"
13
+ )
14
+
15
+ response = email_api.messages.create(349984, message)
16
+ assert response.present?
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def email_api
23
+ @email_api ||= Listrak::EmailApi.new client_id: 'doyfni0aw64ogd84ld6t',
24
+ client_secret: 'LxdEE4Gu4aSJv5tS9osd8WudjGbJ+EIPYvZBS7bc5JU'
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,50 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Listrak
5
+ class EmailApi::TransactionalMessagesTest < TestCase
6
+ def test_create
7
+ VCR.use_cassette 'listrak/email_api/transactional_messages_create-successful' do
8
+ transactional_message_form = Listrak::Models::TransactionalMessageForm.new(
9
+ email_address: 'plugins@workarea.com',
10
+ segmentation_field_values: [
11
+ { segmentationFieldId: 2446151, value: 'Ben' },
12
+ { segmentationFieldId: 2446152, value: 'Crouse' },
13
+ { segmentationFieldId: 2446153, value: '22 S. 3rd St.' },
14
+ { segmentationFieldId: 2446154, value: 'Second Floor' },
15
+ { segmentationFieldId: 2446155, value: 'Philadelphia' },
16
+ { segmentationFieldId: 2446156, value: 'PA' },
17
+ { segmentationFieldId: 2446157, value: '19106' },
18
+ { segmentationFieldId: 2446158, value: 'US' },
19
+ { segmentationFieldId: 2446159, value: "" },
20
+ { segmentationFieldId: 2446169, value: "1234" },
21
+ { segmentationFieldId: 2446174, value: "" },
22
+ { segmentationFieldId: 2446175, value: Time.current.to_s },
23
+ { segmentationFieldId: 2446179, value: "10.00" },
24
+ { segmentationFieldId: 2446180, value: "0.00" },
25
+ { segmentationFieldId: 2446181, value: "1.00" },
26
+ { segmentationFieldId: 2446182, value: "0.00" },
27
+ { segmentationFieldId: 2446183, value: "11.00" },
28
+ { segmentationFieldId: 2446184, value: "1" }
29
+ ]
30
+ )
31
+
32
+ response = email_api.transactional_messages.create(
33
+ 349984,
34
+ 11838256,
35
+ transactional_message_form
36
+ )
37
+
38
+ assert response.present?
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def email_api
45
+ @email_api ||= Listrak::EmailApi.new client_id: 'doyfni0aw64ogd84ld6t',
46
+ client_secret: 'LxdEE4Gu4aSJv5tS9osd8WudjGbJ+EIPYvZBS7bc5JU'
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Listrak
5
+ class OauthTest < TestCase
6
+ def test_token_with_valid_credentials
7
+ VCR.use_cassette "listrak/oauth-successful" do
8
+ token = Oauth.token client_id: 'doyfni0aw64ogd84ld6t',
9
+ client_secret: 'LxdEE4Gu4aSJv5tS9osd8WudjGbJ+EIPYvZBS7bc5JU'
10
+
11
+ assert token.present?
12
+ end
13
+ end
14
+
15
+ def test_token_with_invalid_credentials
16
+ VCR.use_cassette "listrak/oauth-unsuccessful" do
17
+ error = assert_raises Listrak::OauthError do
18
+ Oauth.token client_id: 'doyfni0aw64ogd84ld6t',
19
+ client_secret: 'LxdEE4Gu4aSJv5tS9osd8WudjGbJ+EIPYvZBS7bc5J'
20
+ end
21
+
22
+ assert_equal({ error: "Invalid Credentials" }.to_json, error.message)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Listrak
5
+ class TransactionalMessageTest < TestCase
6
+ def test_deliver
7
+ Listrak::BogusEmailApi.reset_requests!
8
+ Listrak::BogusEmailApi.store_requests = true
9
+ order = create_placed_order
10
+ create_listrak_configuration(default_list_id: '349984')
11
+
12
+ message = TestOrderConfirmationEmail.new order
13
+
14
+ message.deliver
15
+
16
+ messages = Listrak::BogusEmailApi.requests.dig :transactional_messages, :create
17
+ list_id, message_id, message_form = messages.first
18
+
19
+ assert_equal('349984', list_id)
20
+ assert_equal(11838256, message_id)
21
+ expected_form_json = {
22
+ emailAddress: "bcrouse-new@workarea.com",
23
+ segmentationFieldValues: [
24
+ { segmentationFieldId: 2446151, value: 'Ben' },
25
+ { segmentationFieldId: 2446152, value: 'Crouse' },
26
+ { segmentationFieldId: 2446153, value: '22 S. 3rd St.' },
27
+ { segmentationFieldId: 2446154, value: 'Second Floor' },
28
+ { segmentationFieldId: 2446155, value: 'Philadelphia' },
29
+ { segmentationFieldId: 2446156, value: 'PA' },
30
+ { segmentationFieldId: 2446157, value: '19106' },
31
+ { segmentationFieldId: 2446158, value: 'US' },
32
+ { segmentationFieldId: 2446159, value: "" },
33
+ { segmentationFieldId: 2446169, value: "1234" },
34
+ { segmentationFieldId: 2446174, value: "" },
35
+ { segmentationFieldId: 2446175, value: order.placed_at.to_s },
36
+ { segmentationFieldId: 2446179, value: "10.00" },
37
+ { segmentationFieldId: 2446180, value: "0.00" },
38
+ { segmentationFieldId: 2446181, value: "1.00" },
39
+ { segmentationFieldId: 2446182, value: "0.00" },
40
+ { segmentationFieldId: 2446183, value: "11.00" },
41
+ { segmentationFieldId: 2446184, value: "1" }
42
+ ]
43
+ }.to_json
44
+ assert_equal(expected_form_json, message_form.to_json)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,116 @@
1
+ module Workarea
2
+ module Listrak
3
+ class TestOrderConfirmationEmail
4
+ include Listrak::TransactionalMessage
5
+
6
+ attr_reader :order
7
+
8
+ message_id 11838256
9
+ message_attributes(
10
+ shipping_first_name: 2446151,
11
+ shipping_last_name: 2446152,
12
+ shipping_street_address1: 2446153,
13
+ shipping_street_address2: 2446154,
14
+ shipping_city: 2446155,
15
+ shipping_state: 2446156,
16
+ shipping_zip: 2446157,
17
+ shipping_country: 2446158,
18
+ shipping_phone: 2446159,
19
+ order_number: 2446169,
20
+ shipping_method: 2446174,
21
+ order_date: 2446175,
22
+ sub_total: 2446179,
23
+ tax: 2446180,
24
+ shipping_cost: 2446181,
25
+ discount: 2446182,
26
+ grand_total: 2446183,
27
+ purchased_item_count: 2446184,
28
+ )
29
+
30
+ def initialize(order)
31
+ @order = order
32
+ end
33
+
34
+ private
35
+
36
+ def email_address
37
+ order.email
38
+ end
39
+
40
+ def shipping
41
+ @shipping ||= Shipping.find_by order_id: order.id
42
+ end
43
+
44
+ def shipping_first_name
45
+ shipping.address.first_name
46
+ end
47
+
48
+ def shipping_last_name
49
+ shipping.address.last_name
50
+ end
51
+
52
+ def shipping_street_address1
53
+ shipping.address.street
54
+ end
55
+
56
+ def shipping_street_address2
57
+ shipping.address.street_2
58
+ end
59
+
60
+ def shipping_city
61
+ shipping.address.city
62
+ end
63
+
64
+ def shipping_state
65
+ shipping.address.region
66
+ end
67
+
68
+ def shipping_zip
69
+ shipping.address.postal_code
70
+ end
71
+
72
+ def shipping_country
73
+ shipping.address.country.alpha2
74
+ end
75
+
76
+ def shipping_phone
77
+ shipping.address.phone_number
78
+ end
79
+
80
+ def order_number
81
+ order.id
82
+ end
83
+
84
+ def shipping_method
85
+ end
86
+
87
+ def order_date
88
+ order.placed_at.to_s
89
+ end
90
+
91
+ def sub_total
92
+ order.subtotal_price.to_s
93
+ end
94
+
95
+ def tax
96
+ order.tax_total.to_s
97
+ end
98
+
99
+ def shipping_cost
100
+ order.shipping_total.to_s
101
+ end
102
+
103
+ def discount
104
+ 0.to_m.to_s
105
+ end
106
+
107
+ def grand_total
108
+ order.total_price.to_s
109
+ end
110
+
111
+ def purchased_item_count
112
+ order.items.size
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,31 @@
1
+ module Workarea
2
+ module Listrak
3
+ module VcrConfig
4
+ def self.included(test)
5
+ super
6
+ test.setup :setup_listrak_secrets
7
+ test.teardown :restore_listrak_secrets
8
+ end
9
+
10
+ private
11
+
12
+ def setup_listrak_secrets
13
+ @_old_secrets = Rails.application.secrets.listrak
14
+ Rails.application.secrets.listrak = {
15
+ data_api: {
16
+ client_id: 'a',
17
+ client_secret: 'ZMOhwRN2MhkP0xicWzcu1rtEY9sjDUq/reVovZOY41U'
18
+ },
19
+ email_api: {
20
+ client_id: 'doyfni0aw64ogd84ld6t',
21
+ client_secret: 'LxdEE4Gu4aSJv5tS9osd8WudjGbJ+EIPYvZBS7bc5JU'
22
+ }
23
+ }
24
+ end
25
+
26
+ def restore_listrak_secrets
27
+ Rails.application.secrets.listrak = @_old_secrets
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,75 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class ListrakSystemTest < SystemTest
5
+ include Listrak::VcrConfig
6
+
7
+ def test_signing_up_in_footer_adds_to_default_list
8
+ VCR.use_cassette 'listrak/system_tests/footer_email_signup-successful' do
9
+ create_listrak_configuration(default_list_id: '349984', external_event_ids: [12714])
10
+
11
+ visit storefront.root_path
12
+
13
+ fill_in :footer_email_signup_field, with: 'epigeon@weblinc.com'
14
+ click_button t('workarea.storefront.users.join')
15
+
16
+ contact = email_api.contacts.get('349984', 'epigeon@weblinc.com')
17
+ assert_equal 'Subscribed', contact.subscription_state
18
+ end
19
+ end
20
+
21
+ def test_signing_up_in_footer_overrides_unsubscribe
22
+ VCR.use_cassette 'listrak/system_tests/footer_email_signup_overrides_unsubscribe' do
23
+ create_listrak_configuration(default_list_id: '349984')
24
+ contact = Listrak::Models::ContactForm.new(
25
+ email: 'customer@workarea.com',
26
+ subscription_state: 'Unsubscribed'
27
+ )
28
+
29
+ email_api.contacts.upsert(349984, contact)
30
+
31
+ visit storefront.root_path
32
+
33
+ fill_in :footer_email_signup_field, with: 'customer@weblinc.com'
34
+ click_button t('workarea.storefront.users.join')
35
+
36
+ contact = email_api.contacts.get('349984', 'customer@weblinc.com')
37
+ assert_equal 'Subscribed', contact.subscription_state
38
+ end
39
+ end
40
+
41
+ def test_unsubscribbing_from_account
42
+ VCR.use_cassette 'listrak/system_tests/unsubscribing' do
43
+ create_listrak_configuration(default_list_id: '349984')
44
+ visit storefront.login_path
45
+
46
+ fill_in :create_account_email, with: 'employee+2@weblinc.com'
47
+ fill_in :create_account_password, with: 'W3bl1nc!'
48
+ check :email_signup
49
+
50
+ click_button :create_account
51
+
52
+ assert_current_path(storefront.users_account_path)
53
+
54
+ contact = email_api.contacts.get('349984', 'employee+2@weblinc.com')
55
+ assert_equal 'Subscribed', contact.subscription_state
56
+
57
+ visit storefront.edit_users_account_path
58
+
59
+ uncheck :email_signup
60
+
61
+ click_button :save_info
62
+
63
+ contact = email_api.contacts.get('349984', 'employee+2@weblinc.com')
64
+ assert_equal 'Unsubscribed', contact.subscription_state
65
+ end
66
+ end
67
+
68
+ private
69
+
70
+ def email_api
71
+ @email_api ||= Listrak::EmailApi.new client_id: 'doyfni0aw64ogd84ld6t',
72
+ client_secret: 'LxdEE4Gu4aSJv5tS9osd8WudjGbJ+EIPYvZBS7bc5JU'
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,16 @@
1
+ require "simplecov"
2
+
3
+ SimpleCov.start "rails" do
4
+ add_filter "/workarea/listrak/version.rb"
5
+ add_filter %r{lib/workarea/listrak/bogus*}
6
+ add_group "View Models", "app/view_models"
7
+ add_group "Queries", "app/queries"
8
+ add_group "Email Api", %r{app.*email_api}
9
+ add_group "Data Api", %r{app.*data_api}
10
+ end
11
+
12
+ ENV["RAILS_ENV"] ||= "test"
13
+
14
+ require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
15
+ require "rails/test_help"
16
+ require "workarea/test_help"
@@ -0,0 +1,88 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://auth.listrak.com/OAuth2/Token
6
+ body:
7
+ encoding: US-ASCII
8
+ string: grant_type=client_credentials&client_id=a&client_secret=b
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ Content-Type:
17
+ - application/x-www-form-urlencoded
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Cache-Control:
24
+ - no-cache
25
+ Pragma:
26
+ - no-cache
27
+ Content-Type:
28
+ - application/json;charset=UTF-8
29
+ Expires:
30
+ - "-1"
31
+ Server:
32
+ - Microsoft-IIS/8.5
33
+ X-Powered-By:
34
+ - ASP.NET
35
+ Date:
36
+ - Fri, 11 Jan 2019 20:11:51 GMT
37
+ Content-Length:
38
+ - '465'
39
+ body:
40
+ encoding: UTF-8
41
+ string: '{"access_token":"c2gMJxk6E1Z8oRkQVu9rYwAADDMCmA45JlrY8CZjVhG2GKzyYSFvgd9TTrESgAbSs-xCu5UwZ6tUVludWg8GQfro_S1RDJ5Gs0bhneQBnCIYya3adUdEEp4ByCTHPjIr1wp2ydWXaK-OMUqZwezZEAVaMRsIwtYPSkA84SdbKhPcRxXtbSXpb4ZrkS5V4GQNNmUm8wVFRP9RSrnivw1LuFGZ1OwyIYBW1az6CXNq7eLHJrHA3UgnviMnpQpfy3sfa67R2wQUduEb2ikFMV53EVmdtZ9KhCRinhtuAjT2dtLa0jGbfLfTvd480XJqC3v9lFMkspXNT3LNHUEoY43HzPql7cV1O8JU6NhiP1nE41iQozLP9YNZcp-feqgRCPqEKSXeVyRTmvyfcMPFvDMvTQ","token_type":"bearer","expires_in":3599}'
42
+ http_version:
43
+ recorded_at: Fri, 11 Jan 2019 20:11:52 GMT
44
+ - request:
45
+ method: post
46
+ uri: https://api.listrak.com/data/v1/Customer
47
+ body:
48
+ encoding: UTF-8
49
+ string: '[{"address":{"address1":"22 S. 3rd St.","address2":"Second Floor","city":"Philadelphia","country":"United
50
+ States of America","state":"PA"},"customerNumber":"5c38f88787c68bbe993a","email":"user0@workarea.com","firstName":"Ben","lastName":"Crouse","registered":true,"zipCode":"19106"}]'
51
+ headers:
52
+ Accept-Encoding:
53
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
54
+ Accept:
55
+ - application/json
56
+ User-Agent:
57
+ - Ruby
58
+ Authorization:
59
+ - Bearer c2gMJxk6E1Z8oRkQVu9rYwAADDMCmA45JlrY8CZjVhG2GKzyYSFvgd9TTrESgAbSs-xCu5UwZ6tUVludWg8GQfro_S1RDJ5Gs0bhneQBnCIYya3adUdEEp4ByCTHPjIr1wp2ydWXaK-OMUqZwezZEAVaMRsIwtYPSkA84SdbKhPcRxXtbSXpb4ZrkS5V4GQNNmUm8wVFRP9RSrnivw1LuFGZ1OwyIYBW1az6CXNq7eLHJrHA3UgnviMnpQpfy3sfa67R2wQUduEb2ikFMV53EVmdtZ9KhCRinhtuAjT2dtLa0jGbfLfTvd480XJqC3v9lFMkspXNT3LNHUEoY43HzPql7cV1O8JU6NhiP1nE41iQozLP9YNZcp-feqgRCPqEKSXeVyRTmvyfcMPFvDMvTQ
60
+ Content-Type:
61
+ - application/json
62
+ response:
63
+ status:
64
+ code: 201
65
+ message: Created
66
+ headers:
67
+ Cache-Control:
68
+ - no-cache
69
+ Pragma:
70
+ - no-cache
71
+ Content-Length:
72
+ - '32'
73
+ Content-Type:
74
+ - application/json; charset=utf-8
75
+ Expires:
76
+ - "-1"
77
+ Server:
78
+ - Microsoft-IIS/8.5
79
+ X-Powered-By:
80
+ - ASP.NET
81
+ Date:
82
+ - Fri, 11 Jan 2019 20:11:51 GMT
83
+ body:
84
+ encoding: UTF-8
85
+ string: '{"status":201,"resourceId":null}'
86
+ http_version:
87
+ recorded_at: Fri, 11 Jan 2019 20:11:52 GMT
88
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,90 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://auth.listrak.com/OAuth2/Token
6
+ body:
7
+ encoding: US-ASCII
8
+ string: grant_type=client_credentials&client_id=a&client_secret=b
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ Content-Type:
17
+ - application/x-www-form-urlencoded
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Cache-Control:
24
+ - no-cache
25
+ Pragma:
26
+ - no-cache
27
+ Content-Type:
28
+ - application/json;charset=UTF-8
29
+ Expires:
30
+ - "-1"
31
+ Server:
32
+ - Microsoft-IIS/8.5
33
+ X-Powered-By:
34
+ - ASP.NET
35
+ Date:
36
+ - Mon, 14 Jan 2019 14:15:18 GMT
37
+ Content-Length:
38
+ - '465'
39
+ body:
40
+ encoding: UTF-8
41
+ string: '{"access_token":"q7loCkft2Ux4T5vjiWsjBLRmzC1waR4Ww4n11nvYE-ZJYHNwnMgfqV-NMywZpRj_jSsgKetRNFuNfBQyYmgGfm-Lq5uNsL-nhXi3mUK0Je-T6XnbOK-FZ4GZ9EgwgHymK5mTcELrlseu4K0_0yCglfAcuLFmGBDBMimcrxNfyWbdMYoXjNww8GcuCq4Cf5P2T975fxSsv2ZHDGSAZ1WcvQcuyhbut__ZUcWkAhaWbMsikgYxJiunZr_U4NU4F5jGkRrsPKf58NR3JU29hS4chd6BOfL68SvcP_KOpPBz58DAETuQyyQp1R-Clq9ttY35G3eip_v0Wlj30ONWKt_oDksHh_UE9T8-JK_8UstX76WDFjEUhVbyiQpitctYx5CVFSMwMzaYXeD6voqTjlNZMA","token_type":"bearer","expires_in":3599}'
42
+ http_version:
43
+ recorded_at: Mon, 14 Jan 2019 14:15:20 GMT
44
+ - request:
45
+ method: post
46
+ uri: https://api.listrak.com/data/v1/Order
47
+ body:
48
+ encoding: UTF-8
49
+ string: '[{"associateID":null,"billingAddress":{"address1":"22 S. 3rd St.","address2":"Second
50
+ Floor","city":"Philadelphia","country":"United States of America","state":"PA"},"couponCode":null,"customerNumber":"","dateEntered":"2019-01-14T14:15:19Z","discountTotal":0.0,"email":"bcrouse-new@workarea.com","handlingTotal":1.0,"items":[{"discountDescription":null,"discountType":null,"discountedPrice":0,"itemTotal":10.0,"itemDiscountTotal":0,"meta1":null,"meta2":null,"meta3":null,"meta4":null,"meta5":null,"orderNumber":"1234","price":5.0,"quantity":2,"shipDate":null,"shippingMethod":null,"sku":"SKU","status":null,"trackingNumber":null}],"itemTotal":10.0,"merchandiseDiscount":0.0,"merchandiseDiscountDescription":null,"merchandiseDiscountType":null,"meta1":null,"meta2":null,"meta3":null,"meta4":null,"meta5":null,"nonMerchandiseDiscount":null,"nonMerchandiseDiscountDescription":null,"nonMerchandiseDiscountType":null,"orderNumber":"1234","orderTotal":10.0,"shipDate":null,"shippingAddress":{"address1":"22
51
+ S. 3rd St.","address2":"Second Floor","city":"Philadelphia","country":"United
52
+ States of America","state":"PA"},"shippingMethod":"Test 0","shippingTotal":1.0,"source":"web","status":"placed","storeNumber":null,"taxTotal":0.0,"trackingNumber":null}]'
53
+ headers:
54
+ Accept-Encoding:
55
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
56
+ Accept:
57
+ - application/json
58
+ User-Agent:
59
+ - Ruby
60
+ Authorization:
61
+ - Bearer q7loCkft2Ux4T5vjiWsjBLRmzC1waR4Ww4n11nvYE-ZJYHNwnMgfqV-NMywZpRj_jSsgKetRNFuNfBQyYmgGfm-Lq5uNsL-nhXi3mUK0Je-T6XnbOK-FZ4GZ9EgwgHymK5mTcELrlseu4K0_0yCglfAcuLFmGBDBMimcrxNfyWbdMYoXjNww8GcuCq4Cf5P2T975fxSsv2ZHDGSAZ1WcvQcuyhbut__ZUcWkAhaWbMsikgYxJiunZr_U4NU4F5jGkRrsPKf58NR3JU29hS4chd6BOfL68SvcP_KOpPBz58DAETuQyyQp1R-Clq9ttY35G3eip_v0Wlj30ONWKt_oDksHh_UE9T8-JK_8UstX76WDFjEUhVbyiQpitctYx5CVFSMwMzaYXeD6voqTjlNZMA
62
+ Content-Type:
63
+ - application/json
64
+ response:
65
+ status:
66
+ code: 201
67
+ message: Created
68
+ headers:
69
+ Cache-Control:
70
+ - no-cache
71
+ Pragma:
72
+ - no-cache
73
+ Content-Length:
74
+ - '32'
75
+ Content-Type:
76
+ - application/json; charset=utf-8
77
+ Expires:
78
+ - "-1"
79
+ Server:
80
+ - Microsoft-IIS/8.5
81
+ X-Powered-By:
82
+ - ASP.NET
83
+ Date:
84
+ - Mon, 14 Jan 2019 14:15:20 GMT
85
+ body:
86
+ encoding: UTF-8
87
+ string: '{"status":201,"resourceId":null}'
88
+ http_version:
89
+ recorded_at: Mon, 14 Jan 2019 14:15:20 GMT
90
+ recorded_with: VCR 2.9.3