solidus_core 1.1.0 → 1.1.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 (228) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Rakefile +16 -0
  4. data/script/rails +9 -0
  5. data/solidus_core.gemspec +48 -0
  6. data/spec/fixtures/thinking-cat.jpg +0 -0
  7. data/spec/helpers/base_helper_spec.rb +173 -0
  8. data/spec/helpers/order_helper_spec.rb +12 -0
  9. data/spec/helpers/products_helper_spec.rb +208 -0
  10. data/spec/helpers/taxons_helper_spec.rb +17 -0
  11. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  12. data/spec/lib/i18n_spec.rb +106 -0
  13. data/spec/lib/search/base_spec.rb +86 -0
  14. data/spec/lib/search/variant_spec.rb +112 -0
  15. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +66 -0
  16. data/spec/lib/spree/core/controller_helpers/order_spec.rb +92 -0
  17. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +80 -0
  18. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  19. data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
  20. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  21. data/spec/lib/spree/core/current_store_spec.rb +36 -0
  22. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +24 -0
  23. data/spec/lib/spree/core/importer/order_spec.rb +431 -0
  24. data/spec/lib/spree/core/role_configuration_spec.rb +156 -0
  25. data/spec/lib/spree/core/unreturned_item_charger_spec.rb +130 -0
  26. data/spec/lib/spree/core/validators/email_spec.rb +48 -0
  27. data/spec/lib/spree/localized_number_spec.rb +38 -0
  28. data/spec/lib/spree/migrations_spec.rb +36 -0
  29. data/spec/lib/spree/money_spec.rb +127 -0
  30. data/spec/lib/tasks/exchanges_spec.rb +231 -0
  31. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +115 -0
  32. data/spec/lib/tasks/order_capturing_spec.rb +56 -0
  33. data/spec/mailers/carton_mailer_spec.rb +55 -0
  34. data/spec/mailers/order_mailer_spec.rb +135 -0
  35. data/spec/mailers/reimbursement_mailer_spec.rb +40 -0
  36. data/spec/mailers/test_mailer_spec.rb +15 -0
  37. data/spec/models/spree/ability_spec.rb +276 -0
  38. data/spec/models/spree/address_spec.rb +376 -0
  39. data/spec/models/spree/adjustment_reason_spec.rb +13 -0
  40. data/spec/models/spree/adjustment_spec.rb +169 -0
  41. data/spec/models/spree/app_configuration_spec.rb +24 -0
  42. data/spec/models/spree/asset_spec.rb +24 -0
  43. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  44. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  45. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  46. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  47. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  48. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  49. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +60 -0
  50. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  51. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  52. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  53. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  54. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +30 -0
  55. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +36 -0
  56. data/spec/models/spree/calculator/tiered_percent_spec.rb +47 -0
  57. data/spec/models/spree/calculator_spec.rb +36 -0
  58. data/spec/models/spree/carton_spec.rb +133 -0
  59. data/spec/models/spree/classification_spec.rb +93 -0
  60. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  61. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +25 -0
  62. data/spec/models/spree/concerns/user_address_book_spec.rb +332 -0
  63. data/spec/models/spree/concerns/user_methods_spec.rb +41 -0
  64. data/spec/models/spree/credit_card_spec.rb +341 -0
  65. data/spec/models/spree/customer_return_spec.rb +276 -0
  66. data/spec/models/spree/exchange_spec.rb +79 -0
  67. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  68. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  69. data/spec/models/spree/gateway_spec.rb +104 -0
  70. data/spec/models/spree/inventory_unit_spec.rb +307 -0
  71. data/spec/models/spree/item_adjustments_spec.rb +275 -0
  72. data/spec/models/spree/line_item_spec.rb +199 -0
  73. data/spec/models/spree/option_type_spec.rb +14 -0
  74. data/spec/models/spree/option_value_spec.rb +45 -0
  75. data/spec/models/spree/order/address_spec.rb +50 -0
  76. data/spec/models/spree/order/adjustments_spec.rb +27 -0
  77. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  78. data/spec/models/spree/order/checkout_spec.rb +884 -0
  79. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  80. data/spec/models/spree/order/finalizing_spec.rb +110 -0
  81. data/spec/models/spree/order/payment_spec.rb +243 -0
  82. data/spec/models/spree/order/risk_assessment_spec.rb +68 -0
  83. data/spec/models/spree/order/state_machine_spec.rb +209 -0
  84. data/spec/models/spree/order/tax_spec.rb +84 -0
  85. data/spec/models/spree/order/totals_spec.rb +24 -0
  86. data/spec/models/spree/order/updating_spec.rb +18 -0
  87. data/spec/models/spree/order/validations_spec.rb +15 -0
  88. data/spec/models/spree/order_cancellations_spec.rb +120 -0
  89. data/spec/models/spree/order_capturing_spec.rb +150 -0
  90. data/spec/models/spree/order_contents_spec.rb +307 -0
  91. data/spec/models/spree/order_inventory_spec.rb +228 -0
  92. data/spec/models/spree/order_mutex_spec.rb +85 -0
  93. data/spec/models/spree/order_promotion_spec.rb +31 -0
  94. data/spec/models/spree/order_shipping_spec.rb +241 -0
  95. data/spec/models/spree/order_spec.rb +1482 -0
  96. data/spec/models/spree/order_stock_location_spec.rb +18 -0
  97. data/spec/models/spree/order_updater_spec.rb +283 -0
  98. data/spec/models/spree/payment_method/store_credit_spec.rb +294 -0
  99. data/spec/models/spree/payment_method_spec.rb +147 -0
  100. data/spec/models/spree/payment_spec.rb +1087 -0
  101. data/spec/models/spree/permission_sets/base_spec.rb +12 -0
  102. data/spec/models/spree/permission_sets/configuration_display.rb +82 -0
  103. data/spec/models/spree/permission_sets/configuration_management_spec.rb +50 -0
  104. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +22 -0
  105. data/spec/models/spree/permission_sets/order_display_spec.rb +55 -0
  106. data/spec/models/spree/permission_sets/order_management_spec.rb +42 -0
  107. data/spec/models/spree/permission_sets/product_display_spec.rb +60 -0
  108. data/spec/models/spree/permission_sets/product_management_spec.rb +40 -0
  109. data/spec/models/spree/permission_sets/promotion_display_spec.rb +40 -0
  110. data/spec/models/spree/permission_sets/promotion_management_spec.rb +26 -0
  111. data/spec/models/spree/permission_sets/report_display_spec.rb +24 -0
  112. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +41 -0
  113. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +41 -0
  114. data/spec/models/spree/permission_sets/restricted_stock_transfer_display_spec.rb +50 -0
  115. data/spec/models/spree/permission_sets/restricted_stock_transfer_management_spec.rb +160 -0
  116. data/spec/models/spree/permission_sets/stock_display_spec.rb +24 -0
  117. data/spec/models/spree/permission_sets/stock_management_spec.rb +22 -0
  118. data/spec/models/spree/permission_sets/stock_transfer_display_spec.rb +24 -0
  119. data/spec/models/spree/permission_sets/stock_transfer_management_spec.rb +25 -0
  120. data/spec/models/spree/permission_sets/user_display_spec.rb +38 -0
  121. data/spec/models/spree/permission_sets/user_management_spec.rb +48 -0
  122. data/spec/models/spree/preference_spec.rb +80 -0
  123. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  124. data/spec/models/spree/preferences/preferable_spec.rb +294 -0
  125. data/spec/models/spree/preferences/scoped_store_spec.rb +60 -0
  126. data/spec/models/spree/preferences/static_model_preferences_spec.rb +78 -0
  127. data/spec/models/spree/preferences/statically_configurable_spec.rb +60 -0
  128. data/spec/models/spree/preferences/store_spec.rb +39 -0
  129. data/spec/models/spree/price_spec.rb +42 -0
  130. data/spec/models/spree/product/scopes_spec.rb +116 -0
  131. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  132. data/spec/models/spree/product_filter_spec.rb +26 -0
  133. data/spec/models/spree/product_property_spec.rb +18 -0
  134. data/spec/models/spree/product_spec.rb +504 -0
  135. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +96 -0
  136. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +165 -0
  137. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +115 -0
  138. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +40 -0
  139. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  140. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +69 -0
  141. data/spec/models/spree/promotion/rules/item_total_spec.rb +67 -0
  142. data/spec/models/spree/promotion/rules/nth_order_spec.rb +70 -0
  143. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  144. data/spec/models/spree/promotion/rules/option_value_spec.rb +94 -0
  145. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  146. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  147. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  148. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  149. data/spec/models/spree/promotion_builder_spec.rb +118 -0
  150. data/spec/models/spree/promotion_category_spec.rb +17 -0
  151. data/spec/models/spree/promotion_code/code_builder_spec.rb +79 -0
  152. data/spec/models/spree/promotion_code_spec.rb +187 -0
  153. data/spec/models/spree/promotion_handler/cart_spec.rb +130 -0
  154. data/spec/models/spree/promotion_handler/coupon_spec.rb +335 -0
  155. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +47 -0
  156. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  157. data/spec/models/spree/promotion_rule_spec.rb +28 -0
  158. data/spec/models/spree/promotion_spec.rb +776 -0
  159. data/spec/models/spree/refund_spec.rb +192 -0
  160. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  161. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  162. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  163. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  164. data/spec/models/spree/reimbursement_spec.rb +231 -0
  165. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  166. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  167. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  168. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +107 -0
  169. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +97 -0
  170. data/spec/models/spree/return_authorization_spec.rb +290 -0
  171. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  172. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  173. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +85 -0
  174. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  175. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  176. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  177. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  178. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  179. data/spec/models/spree/return_item_spec.rb +776 -0
  180. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  181. data/spec/models/spree/shipment_spec.rb +753 -0
  182. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  183. data/spec/models/spree/shipping_manifest_spec.rb +94 -0
  184. data/spec/models/spree/shipping_method_spec.rb +88 -0
  185. data/spec/models/spree/shipping_rate_spec.rb +142 -0
  186. data/spec/models/spree/state_spec.rb +14 -0
  187. data/spec/models/spree/stock/availability_validator_spec.rb +83 -0
  188. data/spec/models/spree/stock/coordinator_spec.rb +116 -0
  189. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  190. data/spec/models/spree/stock/estimator_spec.rb +146 -0
  191. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  192. data/spec/models/spree/stock/package_spec.rb +163 -0
  193. data/spec/models/spree/stock/packer_spec.rb +91 -0
  194. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  195. data/spec/models/spree/stock/quantifier_spec.rb +115 -0
  196. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  197. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  198. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +50 -0
  199. data/spec/models/spree/stock/splitter/weight_spec.rb +29 -0
  200. data/spec/models/spree/stock_item_spec.rb +444 -0
  201. data/spec/models/spree/stock_location_spec.rb +279 -0
  202. data/spec/models/spree/stock_movement_spec.rb +56 -0
  203. data/spec/models/spree/stock_transfer_spec.rb +290 -0
  204. data/spec/models/spree/store_credit_category_spec.rb +17 -0
  205. data/spec/models/spree/store_credit_event_spec.rb +314 -0
  206. data/spec/models/spree/store_credit_spec.rb +876 -0
  207. data/spec/models/spree/store_spec.rb +55 -0
  208. data/spec/models/spree/tax_category_spec.rb +27 -0
  209. data/spec/models/spree/tax_rate_spec.rb +378 -0
  210. data/spec/models/spree/taxon_spec.rb +74 -0
  211. data/spec/models/spree/taxonomy_spec.rb +18 -0
  212. data/spec/models/spree/tracker_spec.rb +21 -0
  213. data/spec/models/spree/transfer_item_spec.rb +264 -0
  214. data/spec/models/spree/unit_cancel_spec.rb +149 -0
  215. data/spec/models/spree/user_spec.rb +246 -0
  216. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +23 -0
  217. data/spec/models/spree/variant/scopes_spec.rb +55 -0
  218. data/spec/models/spree/variant_property_rule_condition_spec.rb +15 -0
  219. data/spec/models/spree/variant_property_rule_spec.rb +83 -0
  220. data/spec/models/spree/variant_property_rule_value_spec.rb +18 -0
  221. data/spec/models/spree/variant_spec.rb +601 -0
  222. data/spec/models/spree/zone_spec.rb +305 -0
  223. data/spec/spec_helper.rb +80 -0
  224. data/spec/support/big_decimal.rb +5 -0
  225. data/spec/support/concerns/default_price.rb +34 -0
  226. data/spec/support/dummy_ability.rb +4 -0
  227. data/spec/support/test_gateway.rb +2 -0
  228. metadata +242 -2
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Preference, :type => :model do
4
+
5
+ it "should require a key" do
6
+ @preference = Spree::Preference.new
7
+ @preference.key = :test
8
+ @preference.value = true
9
+ expect(@preference).to be_valid
10
+ end
11
+
12
+ describe "type coversion for values" do
13
+ def round_trip_preference(key, value)
14
+ p = Spree::Preference.new
15
+ p.value = value
16
+ p.key = key
17
+ p.save
18
+
19
+ Spree::Preference.find_by_key(key)
20
+ end
21
+
22
+ it ":boolean" do
23
+ value = true
24
+ key = "boolean_key"
25
+ pref = round_trip_preference(key, value)
26
+ expect(pref.value).to eq value
27
+ end
28
+
29
+ it "false :boolean" do
30
+ value = false
31
+ key = "boolean_key"
32
+ pref = round_trip_preference(key, value)
33
+ expect(pref.value).to eq value
34
+ end
35
+
36
+ it ":integer" do
37
+ value = 10
38
+ key = "integer_key"
39
+ pref = round_trip_preference(key, value)
40
+ expect(pref.value).to eq value
41
+ end
42
+
43
+ it ":decimal" do
44
+ value = 1.5
45
+ key = "decimal_key"
46
+ pref = round_trip_preference(key, value)
47
+ expect(pref.value).to eq value
48
+ end
49
+
50
+ it ":string" do
51
+ value = "This is a string"
52
+ key = "string_key"
53
+ pref = round_trip_preference(key, value)
54
+ expect(pref.value).to eq value
55
+ end
56
+
57
+ it ":text" do
58
+ value = "This is a string stored as text"
59
+ key = "text_key"
60
+ pref = round_trip_preference(key, value)
61
+ expect(pref.value).to eq value
62
+ end
63
+
64
+ it ":password" do
65
+ value = "This is a password"
66
+ key = "password_key"
67
+ pref = round_trip_preference(key, value)
68
+ expect(pref.value).to eq value
69
+ end
70
+
71
+ it ":any" do
72
+ value = [1, 2]
73
+ key = "any_key"
74
+ pref = round_trip_preference(key, value)
75
+ expect(pref.value).to eq value
76
+ end
77
+
78
+ end
79
+
80
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Preferences::Configuration, :type => :model do
4
+
5
+ before :all do
6
+ class AppConfig < Spree::Preferences::Configuration
7
+ preference :color, :string, :default => :blue
8
+ end
9
+ @config = AppConfig.new
10
+ end
11
+
12
+ it "has named methods to access preferences" do
13
+ @config.color = 'orange'
14
+ expect(@config.color).to eq 'orange'
15
+ end
16
+
17
+ it "uses [ ] to access preferences" do
18
+ @config[:color] = 'red'
19
+ expect(@config[:color]).to eq 'red'
20
+ end
21
+
22
+ it "uses set/get to access preferences" do
23
+ @config.set(color: 'green')
24
+ expect(@config.get(:color)).to eq 'green'
25
+ end
26
+
27
+ end
28
+
29
+
30
+
@@ -0,0 +1,294 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Preferences::Preferable, :type => :model do
4
+
5
+ before :all do
6
+ class A
7
+ include Spree::Preferences::Preferable
8
+ attr_reader :id
9
+
10
+ def initialize
11
+ @id = rand(999)
12
+ end
13
+
14
+ def preferences
15
+ @preferences ||= default_preferences
16
+ end
17
+
18
+ preference :color, :string, :default => 'green'
19
+ end
20
+
21
+ class B < A
22
+ preference :flavor, :string
23
+ end
24
+ end
25
+
26
+ before :each do
27
+ @a = A.new
28
+ @b = B.new
29
+ end
30
+
31
+ describe "preference definitions" do
32
+ it "parent should not see child definitions" do
33
+ expect(@a.has_preference?(:color)).to be true
34
+ expect(@a.has_preference?(:flavor)).not_to be true
35
+ end
36
+
37
+ it "child should have parent and own definitions" do
38
+ expect(@b.has_preference?(:color)).to be true
39
+ expect(@b.has_preference?(:flavor)).to be true
40
+ end
41
+
42
+ it "instances have defaults" do
43
+ expect(@a.preferred_color).to eq 'green'
44
+ expect(@b.preferred_color).to eq 'green'
45
+ expect(@b.preferred_flavor).to be_nil
46
+ end
47
+
48
+ it "can be asked if it has a preference definition" do
49
+ expect(@a.has_preference?(:color)).to be true
50
+ expect(@a.has_preference?(:bad)).to be false
51
+ end
52
+
53
+ it "can be asked and raises" do
54
+ expect {
55
+ @a.has_preference! :flavor
56
+ }.to raise_error(NoMethodError, "flavor preference not defined")
57
+ end
58
+
59
+ it "has a type" do
60
+ expect(@a.preferred_color_type).to eq :string
61
+ expect(@a.preference_type(:color)).to eq :string
62
+ end
63
+
64
+ it "has a default" do
65
+ expect(@a.preferred_color_default).to eq 'green'
66
+ expect(@a.preference_default(:color)).to eq 'green'
67
+ end
68
+
69
+ it "raises if not defined" do
70
+ expect {
71
+ @a.get_preference :flavor
72
+ }.to raise_error(NoMethodError, "flavor preference not defined")
73
+ end
74
+
75
+ end
76
+
77
+ describe "preference access" do
78
+ it "handles ghost methods for preferences" do
79
+ @a.preferred_color = 'blue'
80
+ expect(@a.preferred_color).to eq 'blue'
81
+ end
82
+
83
+ it "parent and child instances have their own prefs" do
84
+ @a.preferred_color = 'red'
85
+ @b.preferred_color = 'blue'
86
+
87
+ expect(@a.preferred_color).to eq 'red'
88
+ expect(@b.preferred_color).to eq 'blue'
89
+ end
90
+
91
+ it "raises when preference not defined" do
92
+ expect {
93
+ @a.set_preference(:bad, :bone)
94
+ }.to raise_exception(NoMethodError, "bad preference not defined")
95
+ end
96
+
97
+ it "builds a hash of preferences" do
98
+ @b.preferred_flavor = :strawberry
99
+ expect(@b.preferences[:flavor]).to eq 'strawberry'
100
+ expect(@b.preferences[:color]).to eq 'green' #default from A
101
+ end
102
+
103
+ it "builds a hash of preference defaults" do
104
+ expect(@b.default_preferences).to eq({
105
+ flavor: nil,
106
+ color: 'green'
107
+ })
108
+ end
109
+
110
+ context "converts integer preferences to integer values" do
111
+ before do
112
+ A.preference :is_integer, :integer
113
+ end
114
+
115
+ it "with strings" do
116
+ @a.set_preference(:is_integer, '3')
117
+ expect(@a.preferences[:is_integer]).to eq(3)
118
+
119
+ @a.set_preference(:is_integer, '')
120
+ expect(@a.preferences[:is_integer]).to eq(0)
121
+ end
122
+
123
+ end
124
+
125
+ context "converts decimal preferences to BigDecimal values" do
126
+ before do
127
+ A.preference :if_decimal, :decimal
128
+ end
129
+
130
+ it "returns a BigDecimal" do
131
+ @a.set_preference(:if_decimal, 3.3)
132
+ expect(@a.preferences[:if_decimal].class).to eq(BigDecimal)
133
+ end
134
+
135
+ it "with strings" do
136
+ @a.set_preference(:if_decimal, '3.3')
137
+ expect(@a.preferences[:if_decimal]).to eq(3.3)
138
+
139
+ @a.set_preference(:if_decimal, '')
140
+ expect(@a.preferences[:if_decimal]).to eq(0.0)
141
+ end
142
+ end
143
+
144
+ context "converts boolean preferences to boolean values" do
145
+ before do
146
+ A.preference :is_boolean, :boolean, :default => true
147
+ end
148
+
149
+ it "with strings" do
150
+ @a.set_preference(:is_boolean, '0')
151
+ expect(@a.preferences[:is_boolean]).to be false
152
+ @a.set_preference(:is_boolean, 'f')
153
+ expect(@a.preferences[:is_boolean]).to be false
154
+ @a.set_preference(:is_boolean, 't')
155
+ expect(@a.preferences[:is_boolean]).to be true
156
+ end
157
+
158
+ it "with integers" do
159
+ @a.set_preference(:is_boolean, 0)
160
+ expect(@a.preferences[:is_boolean]).to be false
161
+ @a.set_preference(:is_boolean, 1)
162
+ expect(@a.preferences[:is_boolean]).to be true
163
+ end
164
+
165
+ it "with an empty string" do
166
+ @a.set_preference(:is_boolean, '')
167
+ expect(@a.preferences[:is_boolean]).to be false
168
+ end
169
+
170
+ it "with an empty hash" do
171
+ @a.set_preference(:is_boolean, [])
172
+ expect(@a.preferences[:is_boolean]).to be false
173
+ end
174
+ end
175
+
176
+ context "converts array preferences to array values" do
177
+ before do
178
+ A.preference :is_array, :array, default: []
179
+ end
180
+
181
+ it "with arrays" do
182
+ @a.set_preference(:is_array, [])
183
+ expect(@a.preferences[:is_array]).to eq []
184
+ end
185
+ end
186
+
187
+ context "converts hash preferences to hash values" do
188
+ before do
189
+ A.preference :is_hash, :hash, default: {}
190
+ end
191
+
192
+ it "with hash" do
193
+ @a.set_preference(:is_hash, {})
194
+ expect(@a.preferences[:is_hash]).to be_is_a(Hash)
195
+ end
196
+
197
+ it "with hash and keys are integers" do
198
+ @a.set_preference(:is_hash, {1 => 2, 3 => 4})
199
+ expect(@a.preferences[:is_hash]).to eql({1 => 2, 3 => 4})
200
+ end
201
+
202
+ it "with ancestor of a hash" do
203
+ ancestor_of_hash = ActionController::Parameters.new({ key: :value })
204
+ @a.set_preference(:is_hash, ancestor_of_hash)
205
+ expect(@a.preferences[:is_hash]).to eql({"key" => :value})
206
+ end
207
+ end
208
+
209
+ context "converts any preferences to any values" do
210
+ before do
211
+ A.preference :product_ids, :any, :default => []
212
+ A.preference :product_attributes, :any, :default => {}
213
+ end
214
+
215
+ it "with array" do
216
+ expect(@a.preferences[:product_ids]).to eq([])
217
+ @a.set_preference(:product_ids, [1, 2])
218
+ expect(@a.preferences[:product_ids]).to eq([1, 2])
219
+ end
220
+
221
+ it "with hash" do
222
+ expect(@a.preferences[:product_attributes]).to eq({})
223
+ @a.set_preference(:product_attributes, {:id => 1, :name => 2})
224
+ expect(@a.preferences[:product_attributes]).to eq({:id => 1, :name => 2})
225
+ end
226
+ end
227
+
228
+ end
229
+
230
+ describe "persisted preferables" do
231
+ before(:all) do
232
+ class CreatePrefTest < ActiveRecord::Migration
233
+ def self.up
234
+ create_table :pref_tests do |t|
235
+ t.string :col
236
+ t.text :preferences
237
+ end
238
+ end
239
+
240
+ def self.down
241
+ drop_table :pref_tests
242
+ end
243
+ end
244
+
245
+ @migration_verbosity = ActiveRecord::Migration.verbose
246
+ ActiveRecord::Migration.verbose = false
247
+ CreatePrefTest.migrate(:up)
248
+
249
+ class PrefTest < Spree::Base
250
+ preference :pref_test_pref, :string, :default => 'abc'
251
+ preference :pref_test_any, :any, :default => []
252
+ end
253
+ end
254
+
255
+ after(:all) do
256
+ CreatePrefTest.migrate(:down)
257
+ ActiveRecord::Migration.verbose = @migration_verbosity
258
+ end
259
+
260
+ before(:each) do
261
+ @pt = PrefTest.create
262
+ end
263
+
264
+ describe "pending preferences for new activerecord objects" do
265
+ it "saves preferences after record is saved" do
266
+ pr = PrefTest.new
267
+ pr.set_preference(:pref_test_pref, 'XXX')
268
+ expect(pr.get_preference(:pref_test_pref)).to eq('XXX')
269
+ pr.save!
270
+ expect(pr.get_preference(:pref_test_pref)).to eq('XXX')
271
+ end
272
+
273
+ it "saves preferences for serialized object" do
274
+ pr = PrefTest.new
275
+ pr.set_preference(:pref_test_any, [1, 2])
276
+ expect(pr.get_preference(:pref_test_any)).to eq([1, 2])
277
+ pr.save!
278
+ expect(pr.get_preference(:pref_test_any)).to eq([1, 2])
279
+ end
280
+ end
281
+
282
+ it "clear preferences when record is deleted" do
283
+ @pt.save!
284
+ @pt.preferred_pref_test_pref = 'lmn'
285
+ @pt.save!
286
+ @pt.destroy
287
+ @pt1 = PrefTest.new(:col => 'aaaa')
288
+ @pt1.id = @pt.id
289
+ @pt1.save!
290
+ expect(@pt1.get_preference(:pref_test_pref)).to eq('abc')
291
+ end
292
+ end
293
+
294
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Preferences::ScopedStore, :type => :model do
4
+ let(:scoped_store){ described_class.new(prefix, suffix) }
5
+ subject{ scoped_store }
6
+ let(:prefix){ nil }
7
+ let(:suffix){ nil }
8
+
9
+ describe '#store' do
10
+ subject{ scoped_store.store }
11
+ it "uses the global preferences instance" do
12
+ is_expected.to be Spree::Preferences::Store.instance
13
+ end
14
+ end
15
+
16
+ context 'stubbed store' do
17
+ let(:store){ double(:store) }
18
+ before do
19
+ allow(scoped_store).to receive(:store).and_return(store)
20
+ end
21
+
22
+ context "with a prefix" do
23
+ let(:prefix){ 'my_class' }
24
+
25
+ it "can fetch" do
26
+ expect(store).to receive(:fetch).with('my_class/attr')
27
+ scoped_store.fetch('attr'){ 'default' }
28
+ end
29
+
30
+ it "can assign" do
31
+ expect(store).to receive(:[]=).with('my_class/attr', 'val')
32
+ scoped_store['attr'] = 'val'
33
+ end
34
+
35
+ it "can delete" do
36
+ expect(store).to receive(:delete).with('my_class/attr')
37
+ scoped_store.delete('attr')
38
+ end
39
+
40
+ context "and suffix" do
41
+ let(:suffix){ 123 }
42
+
43
+ it "can fetch" do
44
+ expect(store).to receive(:fetch).with('my_class/attr/123')
45
+ scoped_store.fetch('attr'){ 'default' }
46
+ end
47
+
48
+ it "can assign" do
49
+ expect(store).to receive(:[]=).with('my_class/attr/123', 'val')
50
+ scoped_store['attr'] = 'val'
51
+ end
52
+
53
+ it "can delete" do
54
+ expect(store).to receive(:delete).with('my_class/attr/123')
55
+ scoped_store.delete('attr')
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end