workarea-wish_lists 3.0.4

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 (127) 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 +15 -0
  9. data/.scss-lint.yml +188 -0
  10. data/.yardopts +1 -0
  11. data/CHANGELOG.md +610 -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 +58 -0
  17. data/Rakefile +53 -0
  18. data/app/assets/javascripts/workarea/storefront/wish_lists/modules/wish_list_button.js +35 -0
  19. data/app/assets/javascripts/workarea/storefront/wish_lists/modules/wish_list_public_quantity_fields.js +42 -0
  20. data/app/assets/javascripts/workarea/storefront/wish_lists/templates/hidden_input.jst.ejs +1 -0
  21. data/app/assets/stylesheets/workarea/storefront/wish_lists/components/_wish_list_button.scss +6 -0
  22. data/app/assets/stylesheets/workarea/storefront/wish_lists/components/_wish_lists.scss +24 -0
  23. data/app/controllers/workarea/admin/users_controller.decorator +20 -0
  24. data/app/controllers/workarea/storefront/users/wish_lists_controller.rb +128 -0
  25. data/app/controllers/workarea/storefront/wish_lists_controller.rb +22 -0
  26. data/app/models/workarea/wish_list.rb +212 -0
  27. data/app/models/workarea/wish_list/item.rb +76 -0
  28. data/app/models/workarea/wish_list/pricing.rb +14 -0
  29. data/app/models/workarea/wish_list/pricing/calculators/totals_calculator.rb +26 -0
  30. data/app/models/workarea/wish_list/public_search.rb +34 -0
  31. data/app/models/workarea/wish_list/request.rb +36 -0
  32. data/app/seeds/workarea/wish_list_seeds.rb +24 -0
  33. data/app/services/workarea/set_wish_list_details.rb +49 -0
  34. data/app/services/workarea/wish_list_session.rb +53 -0
  35. data/app/view_models/workarea/admin/user_view_model.decorator +12 -0
  36. data/app/view_models/workarea/storefront/user_view_model.decorator +31 -0
  37. data/app/view_models/workarea/storefront/wish_list_item_view_model.rb +35 -0
  38. data/app/view_models/workarea/storefront/wish_list_view_model.rb +75 -0
  39. data/app/views/layouts/workarea/storefront/_wish_lists_link.html.haml +6 -0
  40. data/app/views/workarea/admin/users/_wish_list_card.html.haml +24 -0
  41. data/app/views/workarea/admin/users/_wish_list_item_summary.html.haml +8 -0
  42. data/app/views/workarea/admin/users/wish_list.html.haml +26 -0
  43. data/app/views/workarea/storefront/carts/_move_to_wish_list.html.haml +4 -0
  44. data/app/views/workarea/storefront/products/_add_to_wish_list.html.haml +4 -0
  45. data/app/views/workarea/storefront/style_guides/_wish_lists_product_list_docs.html.haml +158 -0
  46. data/app/views/workarea/storefront/users/accounts/_wish_list_summary.html.haml +15 -0
  47. data/app/views/workarea/storefront/users/wish_lists/show.html.haml +125 -0
  48. data/app/views/workarea/storefront/wish_lists/_wish_lists_link.html.haml +4 -0
  49. data/app/views/workarea/storefront/wish_lists/index.html.haml +32 -0
  50. data/app/views/workarea/storefront/wish_lists/show.html.haml +97 -0
  51. data/app/workers/workarea/mark_wish_list_items_purchased.rb +18 -0
  52. data/app/workers/workarea/update_wish_list_details.rb +19 -0
  53. data/bin/rails +18 -0
  54. data/config/initializers/append_points.rb +46 -0
  55. data/config/initializers/configuration.rb +10 -0
  56. data/config/locales/en.yml +60 -0
  57. data/config/routes.rb +23 -0
  58. data/lib/workarea/testing/factories/wish_lists.rb +22 -0
  59. data/lib/workarea/wish_lists.rb +13 -0
  60. data/lib/workarea/wish_lists/engine.rb +15 -0
  61. data/lib/workarea/wish_lists/version.rb +5 -0
  62. data/test/dummy/Rakefile +6 -0
  63. data/test/dummy/app/assets/config/manifest.js +4 -0
  64. data/test/dummy/app/assets/images/.keep +0 -0
  65. data/test/dummy/app/assets/javascripts/application.js +13 -0
  66. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  67. data/test/dummy/app/controllers/application_controller.rb +3 -0
  68. data/test/dummy/app/controllers/concerns/.keep +0 -0
  69. data/test/dummy/app/helpers/application_helper.rb +2 -0
  70. data/test/dummy/app/jobs/application_job.rb +2 -0
  71. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  72. data/test/dummy/app/models/concerns/.keep +0 -0
  73. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  74. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  75. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  76. data/test/dummy/bin/bundle +3 -0
  77. data/test/dummy/bin/rails +4 -0
  78. data/test/dummy/bin/rake +4 -0
  79. data/test/dummy/bin/setup +34 -0
  80. data/test/dummy/bin/update +29 -0
  81. data/test/dummy/config.ru +5 -0
  82. data/test/dummy/config/application.rb +24 -0
  83. data/test/dummy/config/boot.rb +5 -0
  84. data/test/dummy/config/cable.yml +9 -0
  85. data/test/dummy/config/environment.rb +5 -0
  86. data/test/dummy/config/environments/development.rb +54 -0
  87. data/test/dummy/config/environments/production.rb +86 -0
  88. data/test/dummy/config/environments/test.rb +43 -0
  89. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  90. data/test/dummy/config/initializers/assets.rb +11 -0
  91. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  92. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  93. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  94. data/test/dummy/config/initializers/inflections.rb +16 -0
  95. data/test/dummy/config/initializers/mime_types.rb +4 -0
  96. data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
  97. data/test/dummy/config/initializers/session_store.rb +3 -0
  98. data/test/dummy/config/initializers/workarea.rb +5 -0
  99. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  100. data/test/dummy/config/locales/en.yml +23 -0
  101. data/test/dummy/config/puma.rb +47 -0
  102. data/test/dummy/config/routes.rb +5 -0
  103. data/test/dummy/config/secrets.yml +22 -0
  104. data/test/dummy/config/spring.rb +6 -0
  105. data/test/dummy/db/seeds.rb +3 -0
  106. data/test/dummy/lib/assets/.keep +0 -0
  107. data/test/dummy/log/.keep +0 -0
  108. data/test/dummy/public/404.html +67 -0
  109. data/test/dummy/public/422.html +67 -0
  110. data/test/dummy/public/500.html +66 -0
  111. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  112. data/test/dummy/public/apple-touch-icon.png +0 -0
  113. data/test/dummy/public/favicon.ico +0 -0
  114. data/test/integration/workarea/storefront/wish_lists_integration_test.rb +211 -0
  115. data/test/models/workarea/wish_list/public_search_test.rb +82 -0
  116. data/test/models/workarea/wish_list_test.rb +158 -0
  117. data/test/services/workarea/set_wish_list_details_test.rb +62 -0
  118. data/test/services/workarea/wish_list_session_test.rb +47 -0
  119. data/test/system/workarea/admin/wish_lists_system_test.rb +46 -0
  120. data/test/system/workarea/storefront/wish_lists_system_test.rb +287 -0
  121. data/test/test_helper.rb +10 -0
  122. data/test/view_models/workarea/storefront/user_view_model_test.rb +46 -0
  123. data/test/view_models/workarea/storefront/wish_list_item_view_model_test.rb +47 -0
  124. data/test/view_models/workarea/storefront/wish_list_view_model_test.rb +74 -0
  125. data/test/workers/workarea/mark_wish_list_items_purchased_test.rb +21 -0
  126. data/workarea-wish_lists.gemspec +21 -0
  127. metadata +188 -0
File without changes
File without changes
@@ -0,0 +1,211 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class Catalog::Customizations::Foo < Catalog::Customizations
5
+ customized_fields :foo, :baz
6
+ validates_presence_of :foo
7
+ end
8
+
9
+ module Storefront
10
+ class WishListsIntegrationTest < Workarea::IntegrationTest
11
+ setup :user, :product
12
+
13
+ def user
14
+ @user ||= create_user(email: 'test@workarea.com', password: 'w3bl1nc')
15
+ end
16
+
17
+ def wish_list
18
+ @wish_list ||= WishList.for_user(user.id)
19
+ end
20
+
21
+ def product
22
+ @product ||= create_product(
23
+ name: 'Integration Product',
24
+ variants: [{ sku: 'SKU1', regular: 10.to_m }]
25
+ )
26
+ end
27
+
28
+ def login
29
+ post storefront.login_path,
30
+ params: {
31
+ email: 'test@workarea.com',
32
+ password: 'w3bl1nc'
33
+ }
34
+ end
35
+
36
+ def test_update
37
+ login
38
+
39
+ patch storefront.update_users_wish_list_path,
40
+ params: { privacy: 'shared' }
41
+
42
+ wish_list.reload
43
+ assert(wish_list.shared?)
44
+
45
+ patch storefront.update_users_wish_list_path,
46
+ params: { privacy: 'private' }
47
+
48
+ wish_list.reload
49
+ assert(wish_list.private?)
50
+ end
51
+
52
+ def test_update_item_quantity
53
+ login
54
+
55
+ post storefront.add_to_users_wish_list_path,
56
+ params: {
57
+ product_id: product.id,
58
+ sku: product.skus.first,
59
+ quantity: 1
60
+ }
61
+
62
+ assert_equal(1, wish_list.quantity)
63
+
64
+ patch storefront.update_item_users_wish_list_path(wish_list.items.first),
65
+ params: { quantity: 3 }
66
+
67
+ wish_list.reload
68
+ assert_equal(3, wish_list.quantity)
69
+ end
70
+
71
+ def test_add_item_with_customizations
72
+ login
73
+
74
+ product.update!(customizations: 'foo')
75
+
76
+ assert_difference -> { wish_list.quantity } do
77
+ post storefront.add_to_users_wish_list_path,
78
+ params: {
79
+ product_id: product.id,
80
+ sku: product.skus.first,
81
+ quantity: 1,
82
+ foo: 'bar',
83
+ baz: 'bat'
84
+ }
85
+ wish_list.reload
86
+ end
87
+
88
+ assert_redirected_to(storefront.users_wish_list_path)
89
+ assert(wish_list.items.last.customizations.present?)
90
+ end
91
+
92
+ def test_add_item
93
+ login
94
+
95
+ post storefront.add_to_users_wish_list_path,
96
+ params: {
97
+ product_id: product.id,
98
+ sku: product.skus.first,
99
+ quantity: 1
100
+ }
101
+
102
+ assert_equal(product.id, wish_list.items.first.product_id)
103
+ assert_equal(product.skus.first, wish_list.items.first.sku)
104
+ assert_equal(1, wish_list.items.first.quantity)
105
+ end
106
+
107
+ def test_add_item_after_login
108
+ post storefront.add_to_users_wish_list_path,
109
+ params: {
110
+ product_id: product.id,
111
+ sku: product.skus.first,
112
+ quantity: 1
113
+ }
114
+
115
+ login
116
+ get storefront.users_wish_list_path
117
+
118
+ assert_equal(1, wish_list.quantity)
119
+ assert_equal(product.id, wish_list.items.first.product_id)
120
+ assert_equal(product.skus.first, wish_list.items.first.sku)
121
+ assert_equal(1, wish_list.items.first.quantity)
122
+ end
123
+
124
+ def test_remove_item
125
+ login
126
+
127
+ post storefront.add_to_users_wish_list_path,
128
+ params: {
129
+ product_id: product.id,
130
+ sku: product.skus.first,
131
+ quantity: 1
132
+ }
133
+
134
+ delete storefront.remove_from_users_wish_list_path,
135
+ params: { sku: product.skus.first }
136
+
137
+ assert_equal(0, wish_list.quantity)
138
+ end
139
+
140
+ def test_cannot_add_out_of_stock_products_from_wish_list_to_cart
141
+ inventory = create_inventory(
142
+ id: 'SKU1',
143
+ policy: 'standard',
144
+ available: 1
145
+ )
146
+
147
+ login
148
+
149
+ post storefront.add_to_users_wish_list_path,
150
+ params: {
151
+ product_id: product.id,
152
+ sku: product.skus.first,
153
+ quantity: 1
154
+ }
155
+
156
+ inventory.update_attributes(available: 0)
157
+
158
+ assert_equal(product.id, wish_list.items.first.product_id)
159
+ assert_equal(product.skus.first, wish_list.items.first.sku)
160
+ assert_equal(1, wish_list.items.first.quantity)
161
+
162
+ get storefront.users_wish_list_path
163
+ assert_select '.grid__cell' do
164
+ assert_select('p[class="unavailable"]', true)
165
+ end
166
+
167
+ post storefront.cart_items_path,
168
+ params: {
169
+ product_id: wish_list.items.first.product_id,
170
+ sku: wish_list.items.first.sku,
171
+ quantity: 1
172
+ }
173
+
174
+ assert(response.ok?)
175
+
176
+ order = Order.first
177
+ order.reload
178
+ assert_equal(0, order.quantity)
179
+ end
180
+
181
+ def test_back_out_of_moving_to_wish_list_as_guest
182
+ post storefront.cart_items_path, params: {
183
+ product_id: product.id,
184
+ sku: product.skus.first,
185
+ quantity: 1
186
+ }
187
+ order = Order.last
188
+ item = order.items.first
189
+
190
+ assert_response(:success)
191
+ refute_empty(order.items)
192
+
193
+ post storefront.from_cart_users_wish_list_path(item_id: item.id)
194
+
195
+ assert_redirected_to(storefront.login_path)
196
+ refute_empty(order.reload.items)
197
+ assert_equal(item.id.to_s, session[:wish_list_item_id])
198
+
199
+ login
200
+
201
+ assert_redirected_to(storefront.users_wish_list_path)
202
+
203
+ follow_redirect!
204
+
205
+ assert_response(:success)
206
+ refute(session.key?(:wish_list_item_id))
207
+ assert_empty(order.reload.items)
208
+ end
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,82 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class WishList
5
+ class PublicSearchTest < TestCase
6
+ setup :wish_list, :nameless_wish_list
7
+
8
+ def email
9
+ 'test@workarea.com'
10
+ end
11
+
12
+ def first
13
+ 'Ben'
14
+ end
15
+
16
+ def last
17
+ 'Crouse'
18
+ end
19
+
20
+ def full_name
21
+ [first, last].join(' ')
22
+ end
23
+
24
+ def other_email
25
+ 'test-again@workarea.com'
26
+ end
27
+
28
+ def another_email
29
+ 'test-other@workarea.com'
30
+ end
31
+
32
+ def wish_list
33
+ @wish_list ||= create_wish_list(
34
+ email: email,
35
+ name: full_name,
36
+ first_name: first,
37
+ last_name: last,
38
+ location: 'Philadelphia PA 19106'
39
+ )
40
+ end
41
+
42
+ def nameless_wish_list
43
+ @nameless_wish_list ||= create_wish_list(
44
+ email: another_email,
45
+ name: another_email,
46
+ first_name: '',
47
+ last_name: '',
48
+ location: 'Philadelphia PA 19106'
49
+ )
50
+ end
51
+
52
+ def test_results
53
+ search = Workarea::WishList::PublicSearch.new(full_name)
54
+ assert_equal([wish_list], search.results.to_a)
55
+
56
+ search = Workarea::WishList::PublicSearch.new(another_email)
57
+ refute_empty(search.results)
58
+
59
+ search = Workarea::WishList::PublicSearch.new('bogus@example.com')
60
+ assert_empty(search.results)
61
+
62
+ search = Workarea::WishList::PublicSearch.new(email)
63
+ assert_equal([wish_list], search.results.to_a)
64
+
65
+ search = Workarea::WishList::PublicSearch.new(email)
66
+ assert_equal([wish_list], search.results.to_a)
67
+
68
+ search = Workarea::WishList::PublicSearch.new(full_name, 'Philadelphia')
69
+ assert_equal([wish_list], search.results.to_a)
70
+
71
+ search = Workarea::WishList::PublicSearch.new('bogus')
72
+ assert(search.results.to_a.empty?)
73
+
74
+ wish_list.update_attributes(privacy: 'private')
75
+ assert(Workarea::WishList::PublicSearch.new(full_name).results.empty?)
76
+
77
+ wish_list.update_attributes(privacy: 'shared')
78
+ assert(Workarea::WishList::PublicSearch.new(full_name).results.empty?)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,158 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class WishListTest < TestCase
5
+ def user
6
+ @user ||= create_user(
7
+ first_name: 'Foo',
8
+ last_name: 'Bar',
9
+ email: 'test@workarea.com',
10
+ addresses: [{
11
+ first_name: 'Ben',
12
+ last_name: 'Crouse',
13
+ street: '22 S. 3rd St.',
14
+ street_2: 'Second Floor',
15
+ city: 'Philadelphia',
16
+ region: 'PA',
17
+ postal_code: '19106',
18
+ country: 'US'
19
+ }]
20
+ )
21
+ end
22
+
23
+ def wish_list
24
+ @wish_list ||= WishList.new(user_id: user.id)
25
+ end
26
+
27
+ def order
28
+ @order ||= Workarea::Order.new(email: 'test@workarea.com')
29
+ end
30
+
31
+ def test_creation
32
+ WishList.destroy_all
33
+
34
+ wish_list = WishList.for_user(user.id)
35
+
36
+ assert_equal('Foo', wish_list.first_name)
37
+ assert_equal('Bar', wish_list.last_name)
38
+ assert_equal('Foo Bar', wish_list.name)
39
+ assert_equal('Philadelphia PA US 19106', wish_list.location)
40
+ assert_equal('test@workarea.com', wish_list.email)
41
+
42
+ existing_wish_list = WishList.for_user(user.id)
43
+ assert_equal(wish_list, existing_wish_list)
44
+ end
45
+
46
+ def test_find_by_token
47
+ token = 'kjh23r98b'
48
+ wish_list.update_attributes(token: token)
49
+ assert_equal(wish_list, WishList.find_by_token(token))
50
+
51
+ assert_raise(Workarea::WishList::InvalidToken) { WishList.find_by_token(nil) }
52
+
53
+ wish_list.update_attributes(token: 'kjh23r98b')
54
+ assert_raise(Workarea::WishList::InvalidToken) { WishList.find_by_token('sdkg12gaweb') }
55
+
56
+ token = 'kjh23r98b'
57
+ wish_list.update_attributes(token: token, privacy: 'private')
58
+ assert_raise(Workarea::WishList::InvalidToken) { WishList.find_by_token(token) }
59
+ end
60
+
61
+ def test_find_products
62
+ wish_list.add_item('1234', 'SKU1', 1)
63
+ assert_equal(['1234'], Workarea::WishList.find_products(user.id))
64
+ end
65
+
66
+ def test_named
67
+ create_wish_list(name: '')
68
+ create_wish_list(name: 'Zac Owen')
69
+
70
+ assert_equal(1, Workarea::WishList.named.size)
71
+ create_wish_list(name: 'Foo Bar', email: 'test@test.com')
72
+ assert_equal(2, Workarea::WishList.named.size)
73
+ end
74
+
75
+ def test_public
76
+ wish_list.update_attributes(privacy: 'public')
77
+
78
+ assert(wish_list.public?)
79
+ refute(wish_list.shared?)
80
+ refute(wish_list.private?)
81
+ end
82
+
83
+ def test_shared
84
+ wish_list.update_attributes(privacy: 'shared')
85
+
86
+ refute(wish_list.public?)
87
+ assert(wish_list.shared?)
88
+ refute(wish_list.private?)
89
+ end
90
+
91
+ def test_private
92
+ wish_list.update_attributes(privacy: 'private')
93
+
94
+ refute(wish_list.public?)
95
+ refute(wish_list.shared?)
96
+ assert(wish_list.private?)
97
+ end
98
+
99
+ def test_add_item
100
+ product_id = '1234'
101
+ sku = 'SKU'
102
+
103
+ wish_list.add_item(product_id, sku, 2)
104
+ assert_equal(2, wish_list.quantity)
105
+ assert_equal(product_id, wish_list.items.last.product_id)
106
+ assert_equal(sku, wish_list.items.last.sku)
107
+ assert_equal(2, wish_list.items.last.quantity)
108
+
109
+ wish_list.add_item(product_id, sku, 2)
110
+ assert_equal(1, wish_list.items.length)
111
+ assert_equal(4, wish_list.items.last.quantity)
112
+ end
113
+
114
+ def test_add_item_with_customizations
115
+ product = create_product(customizations: 'unit')
116
+ sku = 'SKU'
117
+
118
+ assert(wish_list.add_item(product.id, sku, 2, {}, foo: 'bar'))
119
+ assert_equal(2, wish_list.quantity)
120
+ assert_equal(product.id, wish_list.items.last.product_id)
121
+ assert_equal(sku, wish_list.items.last.sku)
122
+ assert_equal(2, wish_list.items.last.quantity)
123
+ assert(wish_list.items.last.customizations.present?)
124
+ assert_equal('bar', wish_list.items.last.customizations[:foo])
125
+
126
+ wish_list.add_item(product.id, sku, 2, {}, foo: 'bar')
127
+ assert_equal(1, wish_list.items.length)
128
+ assert_equal(4, wish_list.items.last.quantity)
129
+ assert(wish_list.items.last.customizations.present?)
130
+ assert_equal('bar', wish_list.items.last.customizations[:foo])
131
+
132
+ wish_list.add_item(product.id, sku, 2, {}, foo: 'baz')
133
+ assert_equal(2, wish_list.items.length)
134
+ assert(wish_list.items.last.customizations.present?)
135
+ assert_equal('baz', wish_list.items.last.customizations[:foo])
136
+ end
137
+
138
+ def test_mark_item_purchased
139
+ order.items.build(product_id: '1234', sku: 'SKU', quantity: 1)
140
+
141
+ item = wish_list.items.build(product_id: '1234', sku: 'SKU', quantity: 1)
142
+
143
+ wish_list.mark_item_purchased(item.sku, item.quantity)
144
+ assert(wish_list.unpurchased_items.empty?)
145
+ assert_includes(wish_list.purchased_items, item)
146
+ assert_equal(1, wish_list.items.first.received)
147
+ end
148
+
149
+ def test_remove_item
150
+ sku = 'SKU'
151
+ item = wish_list.items.build(product_id: '1234', sku: sku, quantity: 2)
152
+
153
+ assert_equal(2, wish_list.quantity)
154
+ wish_list.remove_item(sku)
155
+ assert_equal(0, wish_list.quantity)
156
+ end
157
+ end
158
+ end