spree_core 3.0.5 → 3.0.6

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 (194) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Gemfile +3 -0
  4. data/Rakefile +30 -0
  5. data/app/assets/javascripts/spree.js.coffee.erb +1 -1
  6. data/app/models/spree/ability.rb +1 -1
  7. data/app/models/spree/base.rb +3 -1
  8. data/app/models/spree/order_updater.rb +2 -1
  9. data/app/models/spree/price.rb +7 -12
  10. data/app/models/spree/product.rb +3 -2
  11. data/app/models/spree/reimbursement.rb +1 -1
  12. data/app/models/spree/state.rb +2 -0
  13. data/app/models/spree/zone.rb +1 -1
  14. data/lib/spree/core/version.rb +1 -1
  15. data/lib/spree/testing_support/shoulda_matcher_configuration.rb +6 -0
  16. data/script/rails +9 -0
  17. data/spec/fixtures/thinking-cat.jpg +0 -0
  18. data/spec/helpers/base_helper_spec.rb +137 -0
  19. data/spec/helpers/products_helper_spec.rb +224 -0
  20. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  21. data/spec/lib/i18n_spec.rb +123 -0
  22. data/spec/lib/search/base_spec.rb +86 -0
  23. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +101 -0
  24. data/spec/lib/spree/core/controller_helpers/order_spec.rb +95 -0
  25. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  26. data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
  27. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  28. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
  29. data/spec/lib/spree/core/importer/order_spec.rb +502 -0
  30. data/spec/lib/spree/core/validators/email_spec.rb +53 -0
  31. data/spec/lib/spree/localized_number_spec.rb +38 -0
  32. data/spec/lib/spree/migrations_spec.rb +34 -0
  33. data/spec/lib/spree/money_spec.rb +122 -0
  34. data/spec/lib/tasks/exchanges_spec.rb +136 -0
  35. data/spec/mailers/order_mailer_spec.rb +124 -0
  36. data/spec/mailers/reimbursement_mailer_spec.rb +47 -0
  37. data/spec/mailers/shipment_mailer_spec.rb +63 -0
  38. data/spec/mailers/test_mailer_spec.rb +24 -0
  39. data/spec/models/spree/ability_spec.rb +246 -0
  40. data/spec/models/spree/address_spec.rb +291 -0
  41. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +286 -0
  42. data/spec/models/spree/adjustment_spec.rb +163 -0
  43. data/spec/models/spree/app_configuration_spec.rb +23 -0
  44. data/spec/models/spree/asset_spec.rb +25 -0
  45. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  46. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  47. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  48. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  49. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  50. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  51. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +51 -0
  52. data/spec/models/spree/calculator/shipping.rb +8 -0
  53. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  54. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  55. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  56. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  57. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
  58. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
  59. data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
  60. data/spec/models/spree/calculator_spec.rb +69 -0
  61. data/spec/models/spree/classification_spec.rb +93 -0
  62. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  63. data/spec/models/spree/country_spec.rb +18 -0
  64. data/spec/models/spree/credit_card_spec.rb +324 -0
  65. data/spec/models/spree/customer_return_spec.rb +262 -0
  66. data/spec/models/spree/exchange_spec.rb +75 -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 +54 -0
  70. data/spec/models/spree/image_spec.rb +5 -0
  71. data/spec/models/spree/inventory_unit_spec.rb +242 -0
  72. data/spec/models/spree/line_item_spec.rb +267 -0
  73. data/spec/models/spree/option_type_spec.rb +14 -0
  74. data/spec/models/spree/option_value_spec.rb +13 -0
  75. data/spec/models/spree/order/address_spec.rb +50 -0
  76. data/spec/models/spree/order/adjustments_spec.rb +29 -0
  77. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  78. data/spec/models/spree/order/checkout_spec.rb +764 -0
  79. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  80. data/spec/models/spree/order/finalizing_spec.rb +117 -0
  81. data/spec/models/spree/order/helpers_spec.rb +5 -0
  82. data/spec/models/spree/order/payment_spec.rb +214 -0
  83. data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
  84. data/spec/models/spree/order/shipments_spec.rb +43 -0
  85. data/spec/models/spree/order/state_machine_spec.rb +216 -0
  86. data/spec/models/spree/order/tax_spec.rb +84 -0
  87. data/spec/models/spree/order/totals_spec.rb +24 -0
  88. data/spec/models/spree/order/updating_spec.rb +18 -0
  89. data/spec/models/spree/order/validations_spec.rb +15 -0
  90. data/spec/models/spree/order_contents_spec.rb +256 -0
  91. data/spec/models/spree/order_inventory_spec.rb +228 -0
  92. data/spec/models/spree/order_merger_spec.rb +133 -0
  93. data/spec/models/spree/order_spec.rb +954 -0
  94. data/spec/models/spree/order_updater_spec.rb +283 -0
  95. data/spec/models/spree/payment/gateway_options_spec.rb +119 -0
  96. data/spec/models/spree/payment_method_spec.rb +95 -0
  97. data/spec/models/spree/payment_spec.rb +926 -0
  98. data/spec/models/spree/preference_spec.rb +80 -0
  99. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  100. data/spec/models/spree/preferences/preferable_spec.rb +348 -0
  101. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  102. data/spec/models/spree/preferences/store_spec.rb +46 -0
  103. data/spec/models/spree/price_spec.rb +42 -0
  104. data/spec/models/spree/product/scopes_spec.rb +148 -0
  105. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  106. data/spec/models/spree/product_filter_spec.rb +26 -0
  107. data/spec/models/spree/product_option_type_spec.rb +5 -0
  108. data/spec/models/spree/product_property_spec.rb +11 -0
  109. data/spec/models/spree/product_spec.rb +474 -0
  110. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +50 -0
  111. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
  112. data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
  113. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
  114. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  115. data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
  116. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  117. data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
  118. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  119. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  120. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  121. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  122. data/spec/models/spree/promotion_action_spec.rb +10 -0
  123. data/spec/models/spree/promotion_category_spec.rb +17 -0
  124. data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
  125. data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
  126. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
  127. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  128. data/spec/models/spree/promotion_rule_spec.rb +29 -0
  129. data/spec/models/spree/promotion_spec.rb +603 -0
  130. data/spec/models/spree/property_spec.rb +5 -0
  131. data/spec/models/spree/prototype_spec.rb +5 -0
  132. data/spec/models/spree/refund_spec.rb +195 -0
  133. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  134. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  135. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  136. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  137. data/spec/models/spree/reimbursement_spec.rb +215 -0
  138. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  139. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  140. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  141. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
  142. data/spec/models/spree/return_authorization_spec.rb +250 -0
  143. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  144. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  145. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
  146. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  147. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  148. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  149. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  150. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  151. data/spec/models/spree/return_item_spec.rb +682 -0
  152. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  153. data/spec/models/spree/shipment_spec.rb +740 -0
  154. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  155. data/spec/models/spree/shipping_category_spec.rb +5 -0
  156. data/spec/models/spree/shipping_method_spec.rb +88 -0
  157. data/spec/models/spree/shipping_rate_spec.rb +141 -0
  158. data/spec/models/spree/state_spec.rb +18 -0
  159. data/spec/models/spree/stock/availability_validator_spec.rb +36 -0
  160. data/spec/models/spree/stock/content_item_spec.rb +22 -0
  161. data/spec/models/spree/stock/coordinator_spec.rb +51 -0
  162. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  163. data/spec/models/spree/stock/estimator_spec.rb +154 -0
  164. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  165. data/spec/models/spree/stock/package_spec.rb +194 -0
  166. data/spec/models/spree/stock/packer_spec.rb +70 -0
  167. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  168. data/spec/models/spree/stock/quantifier_spec.rb +97 -0
  169. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  170. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  171. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
  172. data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
  173. data/spec/models/spree/stock_item_spec.rb +410 -0
  174. data/spec/models/spree/stock_location_spec.rb +243 -0
  175. data/spec/models/spree/stock_movement_spec.rb +56 -0
  176. data/spec/models/spree/stock_transfer_spec.rb +50 -0
  177. data/spec/models/spree/store_spec.rb +50 -0
  178. data/spec/models/spree/tax_category_spec.rb +27 -0
  179. data/spec/models/spree/tax_rate_spec.rb +382 -0
  180. data/spec/models/spree/taxon_spec.rb +74 -0
  181. data/spec/models/spree/taxonomy_spec.rb +18 -0
  182. data/spec/models/spree/tracker_spec.rb +21 -0
  183. data/spec/models/spree/user_spec.rb +130 -0
  184. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +24 -0
  185. data/spec/models/spree/variant_spec.rb +523 -0
  186. data/spec/models/spree/zone_spec.rb +444 -0
  187. data/spec/spec_helper.rb +74 -0
  188. data/spec/support/big_decimal.rb +5 -0
  189. data/spec/support/concerns/adjustment_source_spec.rb +23 -0
  190. data/spec/support/concerns/default_price_spec.rb +28 -0
  191. data/spec/support/rake.rb +13 -0
  192. data/spec/support/test_gateway.rb +2 -0
  193. data/spree_core.gemspec +48 -0
  194. metadata +185 -4
@@ -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,348 @@
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
+ allow(@a).to receive_messages(:persisted? => true)
29
+ @b = B.new
30
+ allow(@b).to receive_messages(:persisted? => true)
31
+
32
+ # ensure we're persisting as that is the default
33
+ #
34
+ store = Spree::Preferences::Store.instance
35
+ store.persistence = true
36
+ end
37
+
38
+ describe "preference definitions" do
39
+ it "parent should not see child definitions" do
40
+ expect(@a.has_preference?(:color)).to be true
41
+ expect(@a.has_preference?(:flavor)).not_to be true
42
+ end
43
+
44
+ it "child should have parent and own definitions" do
45
+ expect(@b.has_preference?(:color)).to be true
46
+ expect(@b.has_preference?(:flavor)).to be true
47
+ end
48
+
49
+ it "instances have defaults" do
50
+ expect(@a.preferred_color).to eq 'green'
51
+ expect(@b.preferred_color).to eq 'green'
52
+ expect(@b.preferred_flavor).to be_nil
53
+ end
54
+
55
+ it "can be asked if it has a preference definition" do
56
+ expect(@a.has_preference?(:color)).to be true
57
+ expect(@a.has_preference?(:bad)).to be false
58
+ end
59
+
60
+ it "can be asked and raises" do
61
+ expect {
62
+ @a.has_preference! :flavor
63
+ }.to raise_error(NoMethodError, "flavor preference not defined")
64
+ end
65
+
66
+ it "has a type" do
67
+ expect(@a.preferred_color_type).to eq :string
68
+ expect(@a.preference_type(:color)).to eq :string
69
+ end
70
+
71
+ it "has a default" do
72
+ expect(@a.preferred_color_default).to eq 'green'
73
+ expect(@a.preference_default(:color)).to eq 'green'
74
+ end
75
+
76
+ it "raises if not defined" do
77
+ expect {
78
+ @a.get_preference :flavor
79
+ }.to raise_error(NoMethodError, "flavor preference not defined")
80
+ end
81
+
82
+ end
83
+
84
+ describe "preference access" do
85
+ it "handles ghost methods for preferences" do
86
+ @a.preferred_color = 'blue'
87
+ expect(@a.preferred_color).to eq 'blue'
88
+ end
89
+
90
+ it "parent and child instances have their own prefs" do
91
+ @a.preferred_color = 'red'
92
+ @b.preferred_color = 'blue'
93
+
94
+ expect(@a.preferred_color).to eq 'red'
95
+ expect(@b.preferred_color).to eq 'blue'
96
+ end
97
+
98
+ it "raises when preference not defined" do
99
+ expect {
100
+ @a.set_preference(:bad, :bone)
101
+ }.to raise_exception(NoMethodError, "bad preference not defined")
102
+ end
103
+
104
+ it "builds a hash of preferences" do
105
+ @b.preferred_flavor = :strawberry
106
+ expect(@b.preferences[:flavor]).to eq 'strawberry'
107
+ expect(@b.preferences[:color]).to eq 'green' #default from A
108
+ end
109
+
110
+ it "builds a hash of preference defaults" do
111
+ expect(@b.default_preferences).to eq({
112
+ flavor: nil,
113
+ color: 'green'
114
+ })
115
+ end
116
+
117
+ context "converts integer preferences to integer values" do
118
+ before do
119
+ A.preference :is_integer, :integer
120
+ end
121
+
122
+ it "with strings" do
123
+ @a.set_preference(:is_integer, '3')
124
+ expect(@a.preferences[:is_integer]).to eq(3)
125
+
126
+ @a.set_preference(:is_integer, '')
127
+ expect(@a.preferences[:is_integer]).to eq(0)
128
+ end
129
+
130
+ end
131
+
132
+ context "converts decimal preferences to BigDecimal values" do
133
+ before do
134
+ A.preference :if_decimal, :decimal
135
+ end
136
+
137
+ it "returns a BigDecimal" do
138
+ @a.set_preference(:if_decimal, 3.3)
139
+ expect(@a.preferences[:if_decimal].class).to eq(BigDecimal)
140
+ end
141
+
142
+ it "with strings" do
143
+ @a.set_preference(:if_decimal, '3.3')
144
+ expect(@a.preferences[:if_decimal]).to eq(3.3)
145
+
146
+ @a.set_preference(:if_decimal, '')
147
+ expect(@a.preferences[:if_decimal]).to eq(0.0)
148
+ end
149
+ end
150
+
151
+ context "converts boolean preferences to boolean values" do
152
+ before do
153
+ A.preference :is_boolean, :boolean, :default => true
154
+ end
155
+
156
+ it "with strings" do
157
+ @a.set_preference(:is_boolean, '0')
158
+ expect(@a.preferences[:is_boolean]).to be false
159
+ @a.set_preference(:is_boolean, 'f')
160
+ expect(@a.preferences[:is_boolean]).to be false
161
+ @a.set_preference(:is_boolean, 't')
162
+ expect(@a.preferences[:is_boolean]).to be true
163
+ end
164
+
165
+ it "with integers" do
166
+ @a.set_preference(:is_boolean, 0)
167
+ expect(@a.preferences[:is_boolean]).to be false
168
+ @a.set_preference(:is_boolean, 1)
169
+ expect(@a.preferences[:is_boolean]).to be true
170
+ end
171
+
172
+ it "with an empty string" do
173
+ @a.set_preference(:is_boolean, '')
174
+ expect(@a.preferences[:is_boolean]).to be false
175
+ end
176
+
177
+ it "with an empty hash" do
178
+ @a.set_preference(:is_boolean, [])
179
+ expect(@a.preferences[:is_boolean]).to be false
180
+ end
181
+ end
182
+
183
+ context "converts array preferences to array values" do
184
+ before do
185
+ A.preference :is_array, :array, default: []
186
+ end
187
+
188
+ it "with arrays" do
189
+ @a.set_preference(:is_array, [])
190
+ expect(@a.preferences[:is_array]).to be_is_a(Array)
191
+ end
192
+
193
+ it "with string" do
194
+ @a.set_preference(:is_array, "string")
195
+ expect(@a.preferences[:is_array]).to be_is_a(Array)
196
+ end
197
+
198
+ it "with hash" do
199
+ @a.set_preference(:is_array, {})
200
+ expect(@a.preferences[:is_array]).to be_is_a(Array)
201
+ end
202
+ end
203
+
204
+ context "converts hash preferences to hash values" do
205
+ before do
206
+ A.preference :is_hash, :hash, default: {}
207
+ end
208
+
209
+ it "with hash" do
210
+ @a.set_preference(:is_hash, {})
211
+ expect(@a.preferences[:is_hash]).to be_is_a(Hash)
212
+ end
213
+
214
+ it "with hash and keys are integers" do
215
+ @a.set_preference(:is_hash, {1 => 2, 3 => 4})
216
+ expect(@a.preferences[:is_hash]).to eql({1 => 2, 3 => 4})
217
+ end
218
+
219
+ it "with ancestor of a hash" do
220
+ ancestor_of_hash = ActionController::Parameters.new({ key: :value })
221
+ @a.set_preference(:is_hash, ancestor_of_hash)
222
+ expect(@a.preferences[:is_hash]).to eql({"key" => :value})
223
+ end
224
+
225
+ it "with string" do
226
+ @a.set_preference(:is_hash, "{\"0\"=>{\"answer\"=>\"1\", \"value\"=>\"No\"}}")
227
+ expect(@a.preferences[:is_hash]).to be_is_a(Hash)
228
+ end
229
+
230
+ it "with boolean" do
231
+ @a.set_preference(:is_hash, false)
232
+ expect(@a.preferences[:is_hash]).to be_is_a(Hash)
233
+ @a.set_preference(:is_hash, true)
234
+ expect(@a.preferences[:is_hash]).to be_is_a(Hash)
235
+ end
236
+
237
+ it "with simple array" do
238
+ @a.set_preference(:is_hash, ["key", "value", "another key", "another value"])
239
+ expect(@a.preferences[:is_hash]).to be_is_a(Hash)
240
+ expect(@a.preferences[:is_hash]["key"]).to eq("value")
241
+ expect(@a.preferences[:is_hash]["another key"]).to eq("another value")
242
+ end
243
+
244
+ it "with a nested array" do
245
+ @a.set_preference(:is_hash, [["key", "value"], ["another key", "another value"]])
246
+ expect(@a.preferences[:is_hash]).to be_is_a(Hash)
247
+ expect(@a.preferences[:is_hash]["key"]).to eq("value")
248
+ expect(@a.preferences[:is_hash]["another key"]).to eq("another value")
249
+ end
250
+
251
+ it "with single array" do
252
+ expect { @a.set_preference(:is_hash, ["key"]) }.to raise_error(ArgumentError)
253
+ end
254
+ end
255
+
256
+ context "converts any preferences to any values" do
257
+ before do
258
+ A.preference :product_ids, :any, :default => []
259
+ A.preference :product_attributes, :any, :default => {}
260
+ end
261
+
262
+ it "with array" do
263
+ expect(@a.preferences[:product_ids]).to eq([])
264
+ @a.set_preference(:product_ids, [1, 2])
265
+ expect(@a.preferences[:product_ids]).to eq([1, 2])
266
+ end
267
+
268
+ it "with hash" do
269
+ expect(@a.preferences[:product_attributes]).to eq({})
270
+ @a.set_preference(:product_attributes, {:id => 1, :name => 2})
271
+ expect(@a.preferences[:product_attributes]).to eq({:id => 1, :name => 2})
272
+ end
273
+ end
274
+
275
+ end
276
+
277
+ describe "persisted preferables" do
278
+ before(:all) do
279
+ class CreatePrefTest < ActiveRecord::Migration
280
+ def self.up
281
+ create_table :pref_tests do |t|
282
+ t.string :col
283
+ t.text :preferences
284
+ end
285
+ end
286
+
287
+ def self.down
288
+ drop_table :pref_tests
289
+ end
290
+ end
291
+
292
+ @migration_verbosity = ActiveRecord::Migration.verbose
293
+ ActiveRecord::Migration.verbose = false
294
+ CreatePrefTest.migrate(:up)
295
+
296
+ class PrefTest < Spree::Base
297
+ preference :pref_test_pref, :string, :default => 'abc'
298
+ preference :pref_test_any, :any, :default => []
299
+ end
300
+ end
301
+
302
+ after(:all) do
303
+ CreatePrefTest.migrate(:down)
304
+ ActiveRecord::Migration.verbose = @migration_verbosity
305
+ end
306
+
307
+ before(:each) do
308
+ @pt = PrefTest.create
309
+ end
310
+
311
+ describe "pending preferences for new activerecord objects" do
312
+ it "saves preferences after record is saved" do
313
+ pr = PrefTest.new
314
+ pr.set_preference(:pref_test_pref, 'XXX')
315
+ expect(pr.get_preference(:pref_test_pref)).to eq('XXX')
316
+ pr.save!
317
+ expect(pr.get_preference(:pref_test_pref)).to eq('XXX')
318
+ end
319
+
320
+ it "saves preferences for serialized object" do
321
+ pr = PrefTest.new
322
+ pr.set_preference(:pref_test_any, [1, 2])
323
+ expect(pr.get_preference(:pref_test_any)).to eq([1, 2])
324
+ pr.save!
325
+ expect(pr.get_preference(:pref_test_any)).to eq([1, 2])
326
+ end
327
+ end
328
+
329
+ it "clear preferences" do
330
+ @pt.set_preference(:pref_test_pref, 'xyz')
331
+ expect(@pt.preferred_pref_test_pref).to eq('xyz')
332
+ @pt.clear_preferences
333
+ expect(@pt.preferred_pref_test_pref).to eq('abc')
334
+ end
335
+
336
+ it "clear preferences when record is deleted" do
337
+ @pt.save!
338
+ @pt.preferred_pref_test_pref = 'lmn'
339
+ @pt.save!
340
+ @pt.destroy
341
+ @pt1 = PrefTest.new(:col => 'aaaa')
342
+ @pt1.id = @pt.id
343
+ @pt1.save!
344
+ expect(@pt1.get_preference(:pref_test_pref)).to eq('abc')
345
+ end
346
+ end
347
+
348
+ end