workarea-reviews 3.0.8

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 (166) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +20 -0
  3. data/.eslintignore +2 -0
  4. data/.eslintrc +24 -0
  5. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  6. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  7. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  8. data/.gitignore +16 -0
  9. data/.scss-lint.yml +188 -0
  10. data/.yardopts +1 -0
  11. data/CHANGELOG.md +756 -0
  12. data/CODE_OF_CONDUCT.md +3 -0
  13. data/CONTRIBUTING.md +3 -0
  14. data/Gemfile +6 -0
  15. data/LICENSE +52 -0
  16. data/README.md +107 -0
  17. data/Rakefile +54 -0
  18. data/app/assets/images/workarea/admin/icons/star.svg +1 -0
  19. data/app/assets/images/workarea/storefront/icons/empty_star.svg +1 -0
  20. data/app/assets/images/workarea/storefront/icons/half_star.svg +1 -0
  21. data/app/assets/images/workarea/storefront/icons/star.svg +1 -0
  22. data/app/assets/javascripts/workarea/storefront/reviews/modules/product_review_ajax_submit.js +39 -0
  23. data/app/assets/javascripts/workarea/storefront/reviews/modules/product_reviews_sort_menus.js +82 -0
  24. data/app/assets/javascripts/workarea/storefront/reviews/modules/rating_buttons.js +103 -0
  25. data/app/assets/javascripts/workarea/storefront/reviews/templates/sort_by_property.jst.ejs +11 -0
  26. data/app/assets/stylesheets/workarea/storefront/reviews/components/_rating.scss +28 -0
  27. data/app/assets/stylesheets/workarea/storefront/reviews/components/_reviews.scss +59 -0
  28. data/app/assets/stylesheets/workarea/storefront/reviews/components/_reviews_aggregate.scss +38 -0
  29. data/app/assets/stylesheets/workarea/storefront/reviews/components/_write_review.scss +63 -0
  30. data/app/controllers/workarea/admin/catalog_products_controller.decorator +9 -0
  31. data/app/controllers/workarea/admin/import_reviews_controller.rb +35 -0
  32. data/app/controllers/workarea/admin/reviews_controller.rb +51 -0
  33. data/app/controllers/workarea/storefront/review_requests_controller.rb +50 -0
  34. data/app/controllers/workarea/storefront/reviews_controller.rb +53 -0
  35. data/app/helpers/workarea/admin/reviews_helper.rb +12 -0
  36. data/app/helpers/workarea/storefront/reviews_helper.rb +24 -0
  37. data/app/mailers/workarea/admin/status_report_mailer.decorator +8 -0
  38. data/app/mailers/workarea/storefront/review_mailer.rb +23 -0
  39. data/app/models/workarea/catalog/product.decorator +15 -0
  40. data/app/models/workarea/fulfillment.decorator +11 -0
  41. data/app/models/workarea/review/request.rb +62 -0
  42. data/app/models/workarea/review.rb +135 -0
  43. data/app/models/workarea/search/admin/review.rb +72 -0
  44. data/app/models/workarea/search/storefront/product.decorator +9 -0
  45. data/app/models/workarea/sort.decorator +17 -0
  46. data/app/queries/workarea/review_request_params.rb +47 -0
  47. data/app/queries/workarea/review_summary.rb +11 -0
  48. data/app/queries/workarea/search/admin_reviews.rb +40 -0
  49. data/app/queries/workarea/search/category_browse.decorator +9 -0
  50. data/app/queries/workarea/search/product_search.decorator +9 -0
  51. data/app/seeds/reviews.rb +38 -0
  52. data/app/services/workarea/create_review.rb +99 -0
  53. data/app/view_models/workarea/admin/product_view_model.decorator +7 -0
  54. data/app/view_models/workarea/admin/review_view_model.rb +23 -0
  55. data/app/view_models/workarea/admin/reviews_search_view_model.rb +46 -0
  56. data/app/view_models/workarea/storefront/product_view_model.decorator +13 -0
  57. data/app/view_models/workarea/storefront/review_view_model.rb +14 -0
  58. data/app/views/workarea/admin/activities/_review_create.html.haml +12 -0
  59. data/app/views/workarea/admin/activities/_review_destroy.html.haml +10 -0
  60. data/app/views/workarea/admin/activities/_review_update.html.haml +10 -0
  61. data/app/views/workarea/admin/reviews/_aux_navigation.html.haml +5 -0
  62. data/app/views/workarea/admin/reviews/_catalog_products_aux_link.html.haml +5 -0
  63. data/app/views/workarea/admin/reviews/_dashboard_navigation.html.haml +1 -0
  64. data/app/views/workarea/admin/reviews/_menu.html.haml +3 -0
  65. data/app/views/workarea/admin/reviews/_summary.html.haml +12 -0
  66. data/app/views/workarea/admin/reviews/edit.html.haml +77 -0
  67. data/app/views/workarea/admin/reviews/index.html.haml +74 -0
  68. data/app/views/workarea/admin/status_report_mailer/_reviews.html.haml +5 -0
  69. data/app/views/workarea/storefront/products/_rating.html.haml +10 -0
  70. data/app/views/workarea/storefront/products/_reviews.html.haml +23 -0
  71. data/app/views/workarea/storefront/products/_reviews_aggregate.html.haml +22 -0
  72. data/app/views/workarea/storefront/products/_reviews_summary.html.haml +2 -0
  73. data/app/views/workarea/storefront/review_mailer/review_request.html.haml +22 -0
  74. data/app/views/workarea/storefront/review_requests/show.html.haml +44 -0
  75. data/app/views/workarea/storefront/reviews/new.html.haml +68 -0
  76. data/app/views/workarea/storefront/style_guides/_reviews_product_summary_docs.html.haml +13 -0
  77. data/app/views/workarea/storefront/style_guides/components/_reviews.html.haml +17 -0
  78. data/app/workers/workarea/create_review_requests.rb +33 -0
  79. data/app/workers/workarea/schedule_review_requests.rb +44 -0
  80. data/app/workers/workarea/send_review_requests.rb +12 -0
  81. data/app/workers/workarea/update_product_review_data.rb +26 -0
  82. data/bin/rails +18 -0
  83. data/config/initializers/append_points.rb +70 -0
  84. data/config/initializers/assets.rb +1 -0
  85. data/config/initializers/configuration.rb +29 -0
  86. data/config/initializers/rack_attack.rb +11 -0
  87. data/config/initializers/recaptcha.rb +19 -0
  88. data/config/initializers/scheduled_jobs.rb +6 -0
  89. data/config/locales/en.yml +104 -0
  90. data/config/routes.rb +21 -0
  91. data/lib/tasks/verify.rake +16 -0
  92. data/lib/workarea/mailer_previews/storefront/review_mailer_preview.rb +10 -0
  93. data/lib/workarea/reviews/engine.rb +12 -0
  94. data/lib/workarea/reviews/version.rb +5 -0
  95. data/lib/workarea/reviews.rb +13 -0
  96. data/test/dummy/Rakefile +6 -0
  97. data/test/dummy/app/assets/config/manifest.js +4 -0
  98. data/test/dummy/app/assets/images/.keep +0 -0
  99. data/test/dummy/app/assets/javascripts/application.js +13 -0
  100. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  101. data/test/dummy/app/controllers/application_controller.rb +3 -0
  102. data/test/dummy/app/controllers/concerns/.keep +0 -0
  103. data/test/dummy/app/helpers/application_helper.rb +2 -0
  104. data/test/dummy/app/jobs/application_job.rb +2 -0
  105. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  106. data/test/dummy/app/models/concerns/.keep +0 -0
  107. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  108. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  109. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  110. data/test/dummy/bin/bundle +3 -0
  111. data/test/dummy/bin/rails +4 -0
  112. data/test/dummy/bin/rake +4 -0
  113. data/test/dummy/bin/setup +34 -0
  114. data/test/dummy/bin/update +29 -0
  115. data/test/dummy/config/application.rb +25 -0
  116. data/test/dummy/config/boot.rb +5 -0
  117. data/test/dummy/config/cable.yml +9 -0
  118. data/test/dummy/config/environment.rb +5 -0
  119. data/test/dummy/config/environments/development.rb +55 -0
  120. data/test/dummy/config/environments/production.rb +86 -0
  121. data/test/dummy/config/environments/test.rb +43 -0
  122. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  123. data/test/dummy/config/initializers/assets.rb +11 -0
  124. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  125. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  126. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  127. data/test/dummy/config/initializers/inflections.rb +16 -0
  128. data/test/dummy/config/initializers/mime_types.rb +4 -0
  129. data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
  130. data/test/dummy/config/initializers/session_store.rb +3 -0
  131. data/test/dummy/config/initializers/workarea.rb +5 -0
  132. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  133. data/test/dummy/config/locales/en.yml +23 -0
  134. data/test/dummy/config/puma.rb +47 -0
  135. data/test/dummy/config/routes.rb +5 -0
  136. data/test/dummy/config/secrets.yml +22 -0
  137. data/test/dummy/config/spring.rb +6 -0
  138. data/test/dummy/config.ru +5 -0
  139. data/test/dummy/db/seeds.rb +2 -0
  140. data/test/dummy/lib/assets/.keep +0 -0
  141. data/test/dummy/log/.keep +0 -0
  142. data/test/factories/reviews.rb +32 -0
  143. data/test/fixtures/reviews.csv +5 -0
  144. data/test/helpers/workarea/admin/reviews_helper_test.rb +17 -0
  145. data/test/helpers/workarea/storefront/reviews_helper_test.rb +19 -0
  146. data/test/integration/workarea/admin/reviews_integration_test.rb +33 -0
  147. data/test/integration/workarea/storefront/review_requests_integration_test.rb +63 -0
  148. data/test/integration/workarea/storefront/reviews_integration_test.rb +82 -0
  149. data/test/javascripts/fixtures/product_review_ajax_submit.html.haml +4 -0
  150. data/test/javascripts/product_review_ajax_submit_spec.js +28 -0
  151. data/test/javascripts/spec_helper.js +23 -0
  152. data/test/models/workarea/review/request_test.rb +18 -0
  153. data/test/models/workarea/review_test.rb +94 -0
  154. data/test/models/workarea/search/storefront/product_test.decorator +14 -0
  155. data/test/queries/workarea/review_request_params_test.rb +64 -0
  156. data/test/services/workarea/create_review_test.rb +131 -0
  157. data/test/system/workarea/admin/review_system_test.rb +96 -0
  158. data/test/system/workarea/storefront/review_request_system_test.rb +34 -0
  159. data/test/system/workarea/storefront/review_system_test.rb +113 -0
  160. data/test/teaspoon_env.rb +10 -0
  161. data/test/test_helper.rb +11 -0
  162. data/test/workers/workarea/create_review_requests_test.rb +38 -0
  163. data/test/workers/workarea/schedule_review_requests_test.rb +115 -0
  164. data/test/workers/workarea/send_review_requests_test.rb +30 -0
  165. data/workarea-reviews.gemspec +22 -0
  166. metadata +241 -0
@@ -0,0 +1,96 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Admin
5
+ class ReviewSystemTest < SystemTest
6
+ include Admin::IntegrationTest
7
+
8
+ setup :review
9
+
10
+ def review
11
+ @review ||= create_review(
12
+ product_id: product.id,
13
+ user_id: user.id,
14
+ rating: 3,
15
+ title: 'Integration Review',
16
+ approved: false
17
+ )
18
+ end
19
+
20
+ def user
21
+ @user ||= create_user
22
+ end
23
+
24
+ def product
25
+ @product ||= create_product
26
+ end
27
+
28
+ def test_managing_reviews
29
+ visit admin.reviews_path
30
+ click_link t('workarea.storefront.reviews.review_for', product: product.name)
31
+
32
+ click_button 'save_review'
33
+ assert(page.has_content?('Success'))
34
+
35
+ assert(page.has_current_path?(admin.reviews_path))
36
+
37
+ click_link t('workarea.storefront.reviews.review_for', product: product.name)
38
+ click_link t('workarea.admin.actions.delete')
39
+
40
+ assert(page.has_current_path?(admin.reviews_path))
41
+ refute(page.has_content?('Integration Review'))
42
+
43
+ visit admin.activity_path
44
+ assert(
45
+ page.has_content?(
46
+ t('workarea.admin.activities.review_destroy_html', name: 'Integration Review')
47
+ )
48
+ )
49
+ end
50
+
51
+ def test_sorting_by_rating
52
+ reviews = Array.new(3) do |i|
53
+ create_review(
54
+ rating: 5 - i,
55
+ product_id: create_product(name: "Test #{i}").id
56
+ )
57
+ end
58
+
59
+ visit admin.reviews_path
60
+ assert(page.has_ordered_text?('Test 2', 'Test 1', 'Test 0'))
61
+
62
+ select 'Highest Rating', from: :sort
63
+ assert(page.has_ordered_text?('Test 0', 'Test 1', 'Test 2'))
64
+
65
+ select 'Lowest Rating', from: :sort
66
+ assert(page.has_ordered_text?('Test 2', 'Test 1', 'Test 0'))
67
+ end
68
+
69
+ def test_importing_and_exporting
70
+ reviews = Array.new(2) { |i| create_review(product_id: create_product.id) }
71
+ file = create_tempfile(DataFile::Csv.new.serialize(reviews), extension: 'csv')
72
+
73
+ visit admin.reviews_path
74
+ click_link t('workarea.admin.shared.bulk_actions.import')
75
+ attach_file 'import[file]', file.path
76
+ click_button 'create_import'
77
+
78
+ assert_current_path(admin.reviews_path)
79
+ assert(page.has_content?('Success'))
80
+
81
+ click_button t('workarea.admin.shared.bulk_actions.export')
82
+
83
+ Workarea.config.data_file_formats[1..-1].each do |format|
84
+ click_link format.upcase
85
+ assert(page.has_content?(format.upcase))
86
+ end
87
+
88
+ fill_in 'export[emails_list]', with: 'bcrouse@weblinc.com'
89
+ click_button 'create_export'
90
+
91
+ assert_current_path(admin.reviews_path)
92
+ assert(page.has_content?('Success'))
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,34 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Storefront
5
+ class ReviewRequestSystemTest < Workarea::SystemTest
6
+ def test_completing_a_review_request
7
+ order = create_placed_order
8
+ product = create_product
9
+ user = create_user(first_name: 'Bob', last_name: 'Clams')
10
+
11
+ review_request = create_review_request(
12
+ product_id: product.id,
13
+ order_id: order.id,
14
+ email: order.email,
15
+ user_id: user.id
16
+ )
17
+
18
+ visit storefront.review_request_path(review_request.token)
19
+
20
+ assert(page.has_content?(product.name))
21
+
22
+ within '#review_request_form' do
23
+ execute_script("$('#review_rating_4').trigger('click')")
24
+ fill_in 'review[title]', with: 'Pretty decent product'
25
+ fill_in 'review[body]', with: 'It works well.'
26
+ click_button 'submit_review'
27
+ end
28
+
29
+ assert_current_path(storefront.product_path(product))
30
+ assert(page.has_content?('Success'))
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,113 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Storefront
5
+ class ReviewSystemTest < Workarea::SystemTest
6
+ def product
7
+ @product ||= create_product(name: 'Test')
8
+ end
9
+
10
+ def test_showing_reviews_on_browse_page
11
+ create_review(product_id: product.id, rating: 4)
12
+ category = create_category(product_ids: [product.id])
13
+
14
+ visit storefront.category_path(category)
15
+ assert_includes(page.html, '4.0 out of 5 stars')
16
+ end
17
+
18
+ def test_showing_reviews_on_search_results
19
+ create_product(name: 'Another Test')
20
+ create_review(product_id: product.id, rating: 4)
21
+
22
+ visit storefront.search_path(q: 'test')
23
+ assert_includes(page.html, '4.0 out of 5 stars')
24
+ end
25
+
26
+ def test_showing_reviews_on_a_product_detail_page
27
+ create_review(product_id: product.id, rating: 3)
28
+ create_review(
29
+ product_id: product.id,
30
+ rating: 3,
31
+ title: 'Integration Review First'
32
+ )
33
+ create_review(
34
+ product_id: product.id,
35
+ rating: 3,
36
+ title: 'Integration Review Second'
37
+ )
38
+
39
+ visit storefront.product_path(product)
40
+
41
+ assert_includes(page.html, '3.0')
42
+ assert(page.has_content?('(3)'))
43
+ assert(
44
+ page.has_ordered_text?(
45
+ 'Integration Review Second',
46
+ 'Integration Review First'
47
+ )
48
+ )
49
+ end
50
+
51
+ def test_showing_review_from_verified_purchaser
52
+ create_review(
53
+ product_id: product.id,
54
+ rating: 3,
55
+ title: 'Integration Review',
56
+ verified: true
57
+ )
58
+
59
+ visit storefront.product_path(product)
60
+ assert(page.has_content?('Integration Review'))
61
+ assert(page.has_content?(t('workarea.storefront.reviews.verified_purchaser')))
62
+ end
63
+
64
+ def test_writing_a_product_review
65
+ create_user(
66
+ email: 'test@workarea.com',
67
+ password: 'w3bl1nc',
68
+ name: 'Ben Crouse'
69
+ )
70
+
71
+ visit storefront.login_path
72
+
73
+ within '#login_form' do
74
+ fill_in 'email', with: 'test@workarea.com'
75
+ fill_in 'password', with: 'w3bl1nc'
76
+ click_button 'login'
77
+ end
78
+
79
+ visit storefront.product_path(product)
80
+ click_link 'Write a Review'
81
+
82
+ within '#review_form' do
83
+ # svg blocks input
84
+ execute_script("$('#review_rating_4').trigger('click')")
85
+ fill_in 'review[title]', with: 'Pretty decent product'
86
+ fill_in 'review[body]', with: 'It works well.'
87
+ click_button 'submit_review'
88
+ end
89
+
90
+ assert(page.has_content?('Success'))
91
+ assert_no_selector('#review_form')
92
+ end
93
+
94
+ def test_writing_a_product_review_as_a_guest
95
+ visit storefront.product_path(product)
96
+ click_link 'Write a Review'
97
+
98
+ within '#review_form' do
99
+ # svg blocks input
100
+ execute_script("$('#review_rating_4').trigger('click')")
101
+ fill_in 'review[title]', with: 'Pretty decent product'
102
+ fill_in 'review[body]', with: 'It works well.'
103
+ fill_in 'review[first_name]', with: 'Ben'
104
+ fill_in 'review[last_name]', with: 'Crouse'
105
+ click_button 'submit_review'
106
+ end
107
+
108
+ assert(page.has_content?('Success'))
109
+ assert_no_selector('#review_form')
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,10 @@
1
+ require 'workarea/testing/teaspoon'
2
+
3
+ Teaspoon.configure do |config|
4
+ config.root = Workarea::Reviews::Engine.root
5
+ Workarea::Teaspoon.apply(config)
6
+
7
+ config.suite do |suite|
8
+ suite.stylesheets += ['workarea/storefront/application']
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ # Configure Rails Environment
2
+ ENV['RAILS_ENV'] = 'test'
3
+
4
+ require File.expand_path('../../test/dummy/config/environment.rb', __FILE__)
5
+ require 'rails/test_help'
6
+ require 'workarea/test_help'
7
+ require 'factories/reviews'
8
+
9
+ # Filter out Minitest backtrace while allowing backtrace from other libraries
10
+ # to be shown.
11
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
@@ -0,0 +1,38 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class CreateReviewRequestsTest < TestCase
5
+ def test_perform
6
+ product_one = create_product(variants: [{ sku: 'SKU1', regular: 5.to_m }])
7
+ product_two = create_product(variants: [{ sku: 'SKU2', regular: 10.to_m }])
8
+ product_three = create_product(variants: [{ sku: 'SKU3', regular: 15.to_m }])
9
+ product_four = create_product(variants: [{ sku: 'SKU4', regular: 20.to_m }, { sku: 'SKU5', regular: 25.to_m }])
10
+
11
+ user = create_user(first_name: 'Robert', last_name: 'Clams')
12
+ order = create_order(
13
+ user_id: user.id,
14
+ email: user.email,
15
+ items: [
16
+ { product_id: product_one.id, sku: 'SKU1', quantity: 20 },
17
+ { product_id: product_two.id, sku: 'SKU2', quantity: 2 },
18
+ { product_id: product_three.id, sku: 'SKU3', quantity: 1 },
19
+ { product_id: product_four.id, sku: 'SKU4', quantity: 1 },
20
+ { product_id: product_four.id, sku: 'SKU5', quantity: 1 }
21
+ ]
22
+ )
23
+
24
+ Sidekiq::Callbacks.disable(CreateReviewRequests) do
25
+ complete_checkout(order)
26
+ end
27
+
28
+ assert_equal(0, Review::Request.count)
29
+ CreateReviewRequests.new.perform(order.id)
30
+ assert_equal(3, Review::Request.count)
31
+
32
+ requests = Review::Request.all
33
+ assert_includes(requests.map(&:product_id), product_four.id.to_s)
34
+ assert_includes(requests.map(&:product_id), product_three.id.to_s)
35
+ assert_includes(requests.map(&:product_id), product_two.id.to_s)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,115 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class ScheduleReviewRequestsTest < TestCase
5
+ setup :order, :requests
6
+
7
+ def order
8
+ @order ||= create_order(
9
+ items: [
10
+ { product_id: 'PROD1', sku: 'SKU1', quantity: 1 },
11
+ { product_id: 'PROD2', sku: 'SKU2', quantity: 1 },
12
+ { product_id: 'PROD3', sku: 'SKU3', quantity: 1 }
13
+ ]
14
+ )
15
+ end
16
+
17
+ def requests
18
+ @requests ||= [
19
+ create_review_request(order_id: order.id, product_id: 'PROD1', send_after: nil),
20
+ create_review_request(order_id: order.id, product_id: 'PROD2', send_after: nil),
21
+ create_review_request(order_id: order.id, product_id: 'PROD3', send_after: nil)
22
+ ]
23
+ end
24
+
25
+ def test_perform
26
+ travel(3.days) do
27
+ ScheduleReviewRequests.new.perform(
28
+ order.id,
29
+ [
30
+ { 'id' => order.items.first.id.to_s },
31
+ { 'id' => order.items.second.id.to_s },
32
+ { 'id' => order.items.third.id.to_s }
33
+ ]
34
+ )
35
+
36
+ requests.map(&:reload)
37
+ assert(requests.all?(&:send_after))
38
+
39
+ sorted_requests = requests.sort_by(&:send_after)
40
+
41
+ assert_equal(
42
+ Time.current + Workarea.config.review_request_initial_delivery_delay,
43
+ sorted_requests.first.send_after
44
+ )
45
+
46
+ assert_equal(
47
+ sorted_requests.first.send_after + Workarea.config.review_request_secondary_delivery_delay,
48
+ sorted_requests.second.send_after
49
+ )
50
+
51
+ assert_equal(
52
+ sorted_requests.second.send_after + Workarea.config.review_request_secondary_delivery_delay,
53
+ sorted_requests.third.send_after
54
+ )
55
+ end
56
+ end
57
+
58
+ def test_perform_with_partial_shipments
59
+ travel_to(3.days.from_now.beginning_of_day) do
60
+ ScheduleReviewRequests.new.perform(
61
+ order.id,
62
+ [
63
+ { 'id' => order.items.first.id.to_s },
64
+ { 'id' => order.items.third.id.to_s }
65
+ ]
66
+ )
67
+
68
+ requests.map(&:reload)
69
+ assert_equal(2, requests.select(&:send_after).size)
70
+
71
+ sorted_requests = requests.select(&:send_after).sort_by(&:send_after)
72
+
73
+ assert_equal(
74
+ Time.current + Workarea.config.review_request_initial_delivery_delay,
75
+ sorted_requests.first.send_after
76
+ )
77
+
78
+ assert_equal(
79
+ sorted_requests.first.send_after + Workarea.config.review_request_secondary_delivery_delay,
80
+ sorted_requests.second.send_after
81
+ )
82
+ end
83
+
84
+ travel_to(5.days.from_now.beginning_of_day) do
85
+ ScheduleReviewRequests.new.perform(
86
+ order.id,
87
+ [
88
+ { 'id' => order.items.first.id.to_s },
89
+ { 'id' => order.items.second.id.to_s }
90
+ ]
91
+ )
92
+
93
+ requests.map(&:reload)
94
+ assert(requests.all?(&:send_after))
95
+
96
+ sorted_requests = requests.sort_by(&:send_after)
97
+
98
+ assert_equal(
99
+ 2.days.ago + Workarea.config.review_request_initial_delivery_delay,
100
+ sorted_requests.first.send_after
101
+ )
102
+
103
+ assert_equal(
104
+ sorted_requests.first.send_after + Workarea.config.review_request_secondary_delivery_delay,
105
+ sorted_requests.second.send_after
106
+ )
107
+
108
+ assert_equal(
109
+ sorted_requests.second.send_after + Workarea.config.review_request_secondary_delivery_delay,
110
+ sorted_requests.third.send_after
111
+ )
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,30 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class SendReviewRequestsTest < TestCase
5
+ include TestCase::Mail
6
+
7
+ def test_perform
8
+ product = create_product(name: 'Foobar Product')
9
+
10
+ requests = Array.new(3) { create_review_request(product_id: product.id) }
11
+ create_review_request(product_id: product.id, send_after: 1.week.from_now)
12
+ create_review_request(product_id: product.id, send_after: Time.current, canceled_at: Time.current)
13
+
14
+ SendReviewRequests.new.perform
15
+
16
+ requests.each(&:reload)
17
+ assert(requests.all?(&:sent?))
18
+
19
+ assert_equal(3, ActionMailer::Base.deliveries.size)
20
+
21
+ email = ActionMailer::Base.deliveries.last
22
+ assert_includes(email.to, 'test@workarea.com')
23
+ assert_includes(email.subject, product.name)
24
+ assert_includes(
25
+ email.parts.second.body,
26
+ t('workarea.storefront.email.review_request.link')
27
+ )
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,22 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+
3
+ require 'workarea/reviews/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'workarea-reviews'
7
+ s.version = Workarea::Reviews::VERSION
8
+ s.authors = ['Ben Crouse']
9
+ s.email = ['bcrouse@workarea.com']
10
+ s.homepage = 'https://github.com/workarea-commerce/workarea-reviews'
11
+ s.summary = 'Reviews plugin for the Workarea ecommerce platform'
12
+ s.description = 'Plugin for product reviews on the Workarea ecommerce platform'
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+
16
+ s.license = 'Business Software License'
17
+
18
+ s.required_ruby_version = '>= 2.3.0'
19
+
20
+ s.add_dependency 'workarea', '~> 3.x', '>= 3.3.x'
21
+ s.add_dependency 'recaptcha', '~> 4.3.1'
22
+ end