solidus_core 1.0.2 → 1.0.3

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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -0
  3. data/Gemfile +3 -0
  4. data/Rakefile +16 -0
  5. data/script/rails +9 -0
  6. data/solidus_core.gemspec +48 -0
  7. data/spec/fixtures/thinking-cat.jpg +0 -0
  8. data/spec/helpers/base_helper_spec.rb +173 -0
  9. data/spec/helpers/order_helper_spec.rb +12 -0
  10. data/spec/helpers/products_helper_spec.rb +220 -0
  11. data/spec/helpers/taxons_helper_spec.rb +17 -0
  12. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  13. data/spec/lib/i18n_spec.rb +123 -0
  14. data/spec/lib/search/base_spec.rb +86 -0
  15. data/spec/lib/search/variant_spec.rb +92 -0
  16. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +66 -0
  17. data/spec/lib/spree/core/controller_helpers/order_spec.rb +92 -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 +22 -0
  23. data/spec/lib/spree/core/importer/order_spec.rb +431 -0
  24. data/spec/lib/spree/core/role_configuration_spec.rb +138 -0
  25. data/spec/lib/spree/core/validators/email_spec.rb +48 -0
  26. data/spec/lib/spree/localized_number_spec.rb +38 -0
  27. data/spec/lib/spree/migrations_spec.rb +36 -0
  28. data/spec/lib/spree/money_spec.rb +127 -0
  29. data/spec/lib/tasks/exchanges_spec.rb +231 -0
  30. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +115 -0
  31. data/spec/lib/tasks/order_capturing_spec.rb +56 -0
  32. data/spec/mailers/carton_mailer_spec.rb +43 -0
  33. data/spec/mailers/order_mailer_spec.rb +122 -0
  34. data/spec/mailers/reimbursement_mailer_spec.rb +40 -0
  35. data/spec/mailers/test_mailer_spec.rb +15 -0
  36. data/spec/models/spree/ability_spec.rb +276 -0
  37. data/spec/models/spree/address_spec.rb +250 -0
  38. data/spec/models/spree/adjustment_reason_spec.rb +13 -0
  39. data/spec/models/spree/adjustment_spec.rb +177 -0
  40. data/spec/models/spree/app_configuration_spec.rb +20 -0
  41. data/spec/models/spree/asset_spec.rb +24 -0
  42. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  43. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  44. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  45. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  46. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  47. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  48. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +51 -0
  49. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  50. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  51. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  52. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  53. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +30 -0
  54. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +36 -0
  55. data/spec/models/spree/calculator/tiered_percent_spec.rb +47 -0
  56. data/spec/models/spree/calculator_spec.rb +36 -0
  57. data/spec/models/spree/carton_spec.rb +133 -0
  58. data/spec/models/spree/classification_spec.rb +15 -0
  59. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  60. data/spec/models/spree/concerns/user_methods_spec.rb +41 -0
  61. data/spec/models/spree/credit_card_spec.rb +334 -0
  62. data/spec/models/spree/customer_return_spec.rb +276 -0
  63. data/spec/models/spree/exchange_spec.rb +79 -0
  64. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  65. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  66. data/spec/models/spree/gateway_spec.rb +82 -0
  67. data/spec/models/spree/inventory_unit_spec.rb +307 -0
  68. data/spec/models/spree/item_adjustments_spec.rb +256 -0
  69. data/spec/models/spree/line_item_spec.rb +191 -0
  70. data/spec/models/spree/option_type_spec.rb +14 -0
  71. data/spec/models/spree/option_value_spec.rb +22 -0
  72. data/spec/models/spree/order/address_spec.rb +50 -0
  73. data/spec/models/spree/order/adjustments_spec.rb +39 -0
  74. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  75. data/spec/models/spree/order/checkout_spec.rb +902 -0
  76. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  77. data/spec/models/spree/order/finalizing_spec.rb +111 -0
  78. data/spec/models/spree/order/payment_spec.rb +210 -0
  79. data/spec/models/spree/order/risk_assessment_spec.rb +68 -0
  80. data/spec/models/spree/order/state_machine_spec.rb +221 -0
  81. data/spec/models/spree/order/tax_spec.rb +84 -0
  82. data/spec/models/spree/order/totals_spec.rb +24 -0
  83. data/spec/models/spree/order/updating_spec.rb +18 -0
  84. data/spec/models/spree/order/validations_spec.rb +15 -0
  85. data/spec/models/spree/order_cancellations_spec.rb +120 -0
  86. data/spec/models/spree/order_capturing_spec.rb +116 -0
  87. data/spec/models/spree/order_contents_spec.rb +265 -0
  88. data/spec/models/spree/order_inventory_spec.rb +228 -0
  89. data/spec/models/spree/order_mutex_spec.rb +85 -0
  90. data/spec/models/spree/order_promotion_spec.rb +31 -0
  91. data/spec/models/spree/order_shipping_spec.rb +247 -0
  92. data/spec/models/spree/order_spec.rb +1412 -0
  93. data/spec/models/spree/order_stock_location_spec.rb +18 -0
  94. data/spec/models/spree/order_updater_spec.rb +299 -0
  95. data/spec/models/spree/payment_method/store_credit_spec.rb +294 -0
  96. data/spec/models/spree/payment_method_spec.rb +96 -0
  97. data/spec/models/spree/payment_spec.rb +1044 -0
  98. data/spec/models/spree/permission_sets/base_spec.rb +12 -0
  99. data/spec/models/spree/permission_sets/configuration_display.rb +82 -0
  100. data/spec/models/spree/permission_sets/configuration_management_spec.rb +50 -0
  101. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +22 -0
  102. data/spec/models/spree/permission_sets/order_display_spec.rb +49 -0
  103. data/spec/models/spree/permission_sets/order_management_spec.rb +36 -0
  104. data/spec/models/spree/permission_sets/product_display_spec.rb +60 -0
  105. data/spec/models/spree/permission_sets/product_management_spec.rb +40 -0
  106. data/spec/models/spree/permission_sets/promotion_display_spec.rb +34 -0
  107. data/spec/models/spree/permission_sets/promotion_management_spec.rb +26 -0
  108. data/spec/models/spree/permission_sets/report_display_spec.rb +24 -0
  109. data/spec/models/spree/permission_sets/restricted_transfer_management_spec.rb +132 -0
  110. data/spec/models/spree/permission_sets/stock_display_spec.rb +26 -0
  111. data/spec/models/spree/permission_sets/stock_management_spec.rb +24 -0
  112. data/spec/models/spree/permission_sets/user_display_spec.rb +36 -0
  113. data/spec/models/spree/permission_sets/user_management_spec.rb +28 -0
  114. data/spec/models/spree/preference_spec.rb +80 -0
  115. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  116. data/spec/models/spree/preferences/preferable_spec.rb +294 -0
  117. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  118. data/spec/models/spree/preferences/static_model_preferences_spec.rb +78 -0
  119. data/spec/models/spree/preferences/statically_configurable_spec.rb +60 -0
  120. data/spec/models/spree/preferences/store_spec.rb +39 -0
  121. data/spec/models/spree/price_spec.rb +42 -0
  122. data/spec/models/spree/product/scopes_spec.rb +148 -0
  123. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  124. data/spec/models/spree/product_filter_spec.rb +26 -0
  125. data/spec/models/spree/product_property_spec.rb +20 -0
  126. data/spec/models/spree/product_spec.rb +437 -0
  127. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +96 -0
  128. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +165 -0
  129. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +115 -0
  130. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +40 -0
  131. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  132. data/spec/models/spree/promotion/rules/item_total_spec.rb +67 -0
  133. data/spec/models/spree/promotion/rules/nth_order_spec.rb +70 -0
  134. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  135. data/spec/models/spree/promotion/rules/option_value_spec.rb +94 -0
  136. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  137. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  138. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  139. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  140. data/spec/models/spree/promotion_builder_spec.rb +118 -0
  141. data/spec/models/spree/promotion_category_spec.rb +17 -0
  142. data/spec/models/spree/promotion_code/code_builder_spec.rb +79 -0
  143. data/spec/models/spree/promotion_code_spec.rb +187 -0
  144. data/spec/models/spree/promotion_handler/cart_spec.rb +114 -0
  145. data/spec/models/spree/promotion_handler/coupon_spec.rb +335 -0
  146. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +47 -0
  147. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  148. data/spec/models/spree/promotion_rule_spec.rb +28 -0
  149. data/spec/models/spree/promotion_spec.rb +767 -0
  150. data/spec/models/spree/refund_spec.rb +204 -0
  151. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  152. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  153. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  154. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  155. data/spec/models/spree/reimbursement_spec.rb +231 -0
  156. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  157. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  158. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  159. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +107 -0
  160. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +97 -0
  161. data/spec/models/spree/return_authorization_spec.rb +290 -0
  162. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  163. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  164. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +85 -0
  165. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  166. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  167. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  168. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  169. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  170. data/spec/models/spree/return_item_spec.rb +775 -0
  171. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  172. data/spec/models/spree/shipment_spec.rb +709 -0
  173. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  174. data/spec/models/spree/shipping_method_spec.rb +88 -0
  175. data/spec/models/spree/shipping_rate_spec.rb +142 -0
  176. data/spec/models/spree/state_spec.rb +14 -0
  177. data/spec/models/spree/stock/availability_validator_spec.rb +83 -0
  178. data/spec/models/spree/stock/coordinator_spec.rb +116 -0
  179. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  180. data/spec/models/spree/stock/estimator_spec.rb +146 -0
  181. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  182. data/spec/models/spree/stock/package_spec.rb +163 -0
  183. data/spec/models/spree/stock/packer_spec.rb +91 -0
  184. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  185. data/spec/models/spree/stock/quantifier_spec.rb +115 -0
  186. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  187. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  188. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +50 -0
  189. data/spec/models/spree/stock/splitter/weight_spec.rb +29 -0
  190. data/spec/models/spree/stock_item_spec.rb +426 -0
  191. data/spec/models/spree/stock_location_spec.rb +279 -0
  192. data/spec/models/spree/stock_movement_spec.rb +56 -0
  193. data/spec/models/spree/stock_transfer_spec.rb +290 -0
  194. data/spec/models/spree/store_credit_category_spec.rb +17 -0
  195. data/spec/models/spree/store_credit_event_spec.rb +314 -0
  196. data/spec/models/spree/store_credit_spec.rb +876 -0
  197. data/spec/models/spree/store_spec.rb +55 -0
  198. data/spec/models/spree/tax_category_spec.rb +27 -0
  199. data/spec/models/spree/tax_rate_spec.rb +378 -0
  200. data/spec/models/spree/taxon_spec.rb +74 -0
  201. data/spec/models/spree/taxonomy_spec.rb +18 -0
  202. data/spec/models/spree/tracker_spec.rb +21 -0
  203. data/spec/models/spree/transfer_item_spec.rb +264 -0
  204. data/spec/models/spree/unit_cancel_spec.rb +148 -0
  205. data/spec/models/spree/user_spec.rb +223 -0
  206. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +23 -0
  207. data/spec/models/spree/variant/scopes_spec.rb +55 -0
  208. data/spec/models/spree/variant_spec.rb +546 -0
  209. data/spec/models/spree/zone_spec.rb +305 -0
  210. data/spec/spec_helper.rb +78 -0
  211. data/spec/support/big_decimal.rb +5 -0
  212. data/spec/support/concerns/default_price.rb +34 -0
  213. data/spec/support/dummy_ability.rb +4 -0
  214. data/spec/support/test_gateway.rb +2 -0
  215. metadata +229 -3
  216. data/lib/spree/testing_support/rspec-activemodel-mocks_patch.rb +0 -8
@@ -0,0 +1,58 @@
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{ is_expected.to be Spree::Preferences::Store.instance }
12
+ end
13
+
14
+ context 'stubbed store' do
15
+ let(:store){ double(:store) }
16
+ before do
17
+ allow(scoped_store).to receive(:store).and_return(store)
18
+ end
19
+
20
+ context "with a prefix" do
21
+ let(:prefix){ 'my_class' }
22
+
23
+ it "can fetch" do
24
+ expect(store).to receive(:fetch).with('my_class/attr')
25
+ scoped_store.fetch('attr'){ 'default' }
26
+ end
27
+
28
+ it "can assign" do
29
+ expect(store).to receive(:[]=).with('my_class/attr', 'val')
30
+ scoped_store['attr'] = 'val'
31
+ end
32
+
33
+ it "can delete" do
34
+ expect(store).to receive(:delete).with('my_class/attr')
35
+ scoped_store.delete('attr')
36
+ end
37
+
38
+ context "and suffix" do
39
+ let(:suffix){ 123 }
40
+
41
+ it "can fetch" do
42
+ expect(store).to receive(:fetch).with('my_class/attr/123')
43
+ scoped_store.fetch('attr'){ 'default' }
44
+ end
45
+
46
+ it "can assign" do
47
+ expect(store).to receive(:[]=).with('my_class/attr/123', 'val')
48
+ scoped_store['attr'] = 'val'
49
+ end
50
+
51
+ it "can delete" do
52
+ expect(store).to receive(:delete).with('my_class/attr/123')
53
+ scoped_store.delete('attr')
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ RSpec.describe Preferences::StaticModelPreferences do
5
+ let(:preference_class) do
6
+ Class.new do
7
+ include Preferences::Preferable
8
+ preference :color, :string
9
+ end
10
+ end
11
+ let(:other_class){ Class.new }
12
+ let(:definitions){ subject.for_class(preference_class) }
13
+
14
+
15
+ it "is empty by default" do
16
+ expect(definitions).to be_empty
17
+ end
18
+
19
+ it "can store preferences" do
20
+ subject.add(preference_class, 'my_definition', {})
21
+ # just testing that it was added here
22
+ expect(definitions).to have_key('my_definition')
23
+ end
24
+
25
+ it "errors assigning invalid preferences" do
26
+ expect {
27
+ subject.add(preference_class, 'my_definition', {ice_cream: 'chocolate'})
28
+ }.to raise_error(/\APreference :ice_cream is not defined/)
29
+ end
30
+
31
+ context "with stored definitions" do
32
+ before do
33
+ subject.add(preference_class, 'light', {color: 'white'})
34
+ subject.add(preference_class, 'dark', {color: 'black'})
35
+ subject.add(preference_class, 'no_preference', {})
36
+ end
37
+
38
+ describe "complete definition" do
39
+ let(:definition){ definitions['dark'] }
40
+ it "can fetch value" do
41
+ expect(definition.fetch(:color)).to eq 'black'
42
+ end
43
+
44
+ it "can be converted to hash" do
45
+ expect(definition.to_hash).to eq({color: 'black'})
46
+ end
47
+
48
+ it "ignores assignment" do
49
+ definition[:color] = 'maroon'
50
+ expect(definition.fetch(:color)).to eq 'black'
51
+ expect(definition.to_hash).to eq({color: 'black'})
52
+ end
53
+ end
54
+
55
+ describe "empty definition" do
56
+ let(:definition){ definitions['no_preference'] }
57
+
58
+ it "uses fallback value" do
59
+ expect(definition.fetch(:color){ 'red' }).to eq 'red'
60
+ end
61
+
62
+ it "can be converted to hash" do
63
+ expect(definition.to_hash).to eq({})
64
+ end
65
+
66
+ it "ignores assignment" do
67
+ definition[:color] = 'maroon'
68
+ expect(definition.fetch(:color){ 'red' }).to eq 'red'
69
+ expect(definition.to_hash).to eq({})
70
+ end
71
+ end
72
+
73
+ it "is still empty for other classes" do
74
+ expect(subject.for_class(other_class)).to be_empty
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ RSpec.describe Preferences::StaticallyConfigurable do
5
+ let(:superklass) do
6
+ # Same interface activerecord's serialization would provide
7
+ Class.new do
8
+ attr_accessor :preferences
9
+ def initialize
10
+ @preferences = {color: 'blue'}
11
+ end
12
+ end
13
+ end
14
+ let(:klass) do
15
+ Class.new(superklass) do
16
+ include Preferences::Preferable
17
+ include Preferences::StaticallyConfigurable
18
+
19
+ preference :color, :string
20
+
21
+ attr_accessor :preference_source
22
+ end
23
+ end
24
+
25
+ subject do
26
+ klass.new.tap do |o|
27
+ o.preference_source = preference_source
28
+ end
29
+ end
30
+
31
+ before do
32
+ Spree::Config.static_model_preferences.add(klass, 'credentials', color: 'red')
33
+ end
34
+
35
+ describe "available_preference_sources" do
36
+ it "should contain the defined preference sets" do
37
+ expect(klass.available_preference_sources).to eq ['credentials']
38
+ end
39
+ end
40
+
41
+ context "with no preference_source" do
42
+ let(:preference_source) { nil }
43
+ it "uses the persisted preference" do
44
+ expect(subject.preferred_color).to eq "blue"
45
+ end
46
+ end
47
+
48
+ context "with preference_source set" do
49
+ let(:preference_source) { 'credentials' }
50
+ it "uses the statically configured preference" do
51
+ expect(subject.preferred_color).to eq "red"
52
+ end
53
+
54
+ it "ignores assignment" do
55
+ subject.preferences = {color: 'orange'}
56
+ expect(subject.preferred_color).to eq "red"
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Preferences::Store, :type => :model do
4
+ before :each do
5
+ @store = Spree::Preferences::StoreInstance.new
6
+ end
7
+
8
+ it "sets and gets a key" do
9
+ @store.set :test, 1
10
+ expect(@store.exist?(:test)).to be true
11
+ expect(@store.get(:test)).to eq 1
12
+ end
13
+
14
+ it "can set and get false values when cache return nil" do
15
+ @store.set :test, false
16
+ expect(@store.get(:test)).to be false
17
+ end
18
+
19
+ it "will return db value when cache is emtpy and cache the db value" do
20
+ preference = Spree::Preference.where(:key => 'test').first_or_initialize
21
+ preference.value = '123'
22
+ preference.save
23
+
24
+ Rails.cache.clear
25
+ expect(@store.get(:test)).to eq '123'
26
+ expect(Rails.cache.read(:test)).to eq '123'
27
+ end
28
+
29
+ it "should return and cache fallback value when supplied" do
30
+ Rails.cache.clear
31
+ expect(@store.get(:test){ false }).to be false
32
+ expect(Rails.cache.read(:test)).to be false
33
+ end
34
+
35
+ it "should return nil when key can't be found and fallback value is not supplied" do
36
+ expect(@store.get(:random_key){ nil }).to be_nil
37
+ end
38
+
39
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Price, :type => :model do
4
+ describe 'validations' do
5
+ let(:variant) { stub_model Spree::Variant }
6
+ subject { Spree::Price.new variant: variant, amount: amount }
7
+
8
+ context 'when the amount is nil' do
9
+ let(:amount) { nil }
10
+ it { is_expected.to be_valid }
11
+ end
12
+
13
+ context 'when the amount is less than 0' do
14
+ let(:amount) { -1 }
15
+
16
+ it 'has 1 error_on' do
17
+ expect(subject.error_on(:amount).size).to eq(1)
18
+ end
19
+ it 'populates errors' do
20
+ subject.valid?
21
+ expect(subject.errors.messages[:amount].first).to eq 'must be greater than or equal to 0'
22
+ end
23
+ end
24
+
25
+ context 'when the amount is greater than 999,999.99' do
26
+ let(:amount) { 1_000_000 }
27
+
28
+ it 'has 1 error_on' do
29
+ expect(subject.error_on(:amount).size).to eq(1)
30
+ end
31
+ it 'populates errors' do
32
+ subject.valid?
33
+ expect(subject.errors.messages[:amount].first).to eq 'must be less than or equal to 999999.99'
34
+ end
35
+ end
36
+
37
+ context 'when the amount is between 0 and 999,999.99' do
38
+ let(:amount) { 100 }
39
+ it { is_expected.to be_valid }
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,148 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Product scopes", :type => :model do
4
+ let!(:product) { create(:product) }
5
+
6
+ context "A product assigned to parent and child taxons" do
7
+ before do
8
+ @taxonomy = create(:taxonomy)
9
+ @root_taxon = @taxonomy.root
10
+
11
+ @parent_taxon = create(:taxon, :name => 'Parent', :taxonomy_id => @taxonomy.id, :parent => @root_taxon)
12
+ @child_taxon = create(:taxon, :name =>'Child 1', :taxonomy_id => @taxonomy.id, :parent => @parent_taxon)
13
+ @parent_taxon.reload # Need to reload for descendents to show up
14
+
15
+ product.taxons << @parent_taxon
16
+ product.taxons << @child_taxon
17
+ end
18
+
19
+ it "calling Product.in_taxon returns products in child taxons" do
20
+ product.taxons -= [@child_taxon]
21
+ expect(product.taxons.count).to eq(1)
22
+
23
+ expect(Spree::Product.in_taxon(@parent_taxon)).to include(product)
24
+ end
25
+
26
+ it "calling Product.in_taxon should not return duplicate records" do
27
+ expect(Spree::Product.in_taxon(@parent_taxon).to_a.count).to eq(1)
28
+ end
29
+
30
+ context 'orders products based on their ordering within the classifications' do
31
+ let(:other_taxon) { create(:taxon, products: [product]) }
32
+ let!(:product_2) { create(:product, taxons: [@child_taxon, other_taxon]) }
33
+
34
+ it 'by initial ordering' do
35
+ expect(Spree::Product.in_taxon(@child_taxon)).to eq([product, product_2])
36
+ expect(Spree::Product.in_taxon(other_taxon)).to eq([product, product_2])
37
+ end
38
+
39
+ it 'after ordering changed' do
40
+ [@child_taxon, other_taxon].each do |taxon|
41
+ Spree::Classification.find_by(:taxon => taxon, :product => product).insert_at(2)
42
+ expect(Spree::Product.in_taxon(taxon)).to eq([product_2, product])
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ context "property scopes" do
49
+ let(:name) { "A proper tee" }
50
+ let(:value) { "A proper value"}
51
+ let!(:property) { create(:property, name: name)}
52
+
53
+ before do
54
+ product.properties << property
55
+ product.product_properties.find_by(property: property).update_column(:value, value)
56
+ end
57
+
58
+ context "with_property" do
59
+ let(:with_property) { Spree::Product.method(:with_property) }
60
+ it "finds by a property's name" do
61
+ expect(with_property.(name).count).to eq(1)
62
+ end
63
+
64
+ it "doesn't find any properties with an unknown name" do
65
+ expect(with_property.("fake").count).to eq(0)
66
+ end
67
+
68
+ it "finds by a property" do
69
+ expect(with_property.(property).count).to eq(1)
70
+ end
71
+
72
+ it "finds by an id" do
73
+ expect(with_property.(property.id).count).to eq(1)
74
+ end
75
+
76
+ it "cannot find a property with an unknown id" do
77
+ expect(with_property.(0).count).to eq(0)
78
+ end
79
+ end
80
+
81
+ context "with_property_value" do
82
+ let(:with_property_value) { Spree::Product.method(:with_property_value) }
83
+ it "finds by a property's name" do
84
+ expect(with_property_value.(name, value).count).to eq(1)
85
+ end
86
+
87
+ it "cannot find by an unknown property's name" do
88
+ expect(with_property_value.("fake", value).count).to eq(0)
89
+ end
90
+
91
+ it "cannot find with a name by an incorrect value" do
92
+ expect(with_property_value.(name, "fake").count).to eq(0)
93
+ end
94
+
95
+ it "finds by a property" do
96
+ expect(with_property_value.(property, value).count).to eq(1)
97
+ end
98
+
99
+ it "cannot find with a property by an incorrect value" do
100
+ expect(with_property_value.(property, "fake").count).to eq(0)
101
+ end
102
+
103
+ it "finds by an id with a value" do
104
+ expect(with_property_value.(property.id, value).count).to eq(1)
105
+ end
106
+
107
+ it "cannot find with an invalid id" do
108
+ expect(with_property_value.(0, value).count).to eq(0)
109
+ end
110
+
111
+ it "cannot find with an invalid value" do
112
+ expect(with_property_value.(property.id, "fake").count).to eq(0)
113
+ end
114
+ end
115
+ end
116
+
117
+ context '#add_simple_scopes' do
118
+ let(:simple_scopes) { [:ascend_by_updated_at, :descend_by_name] }
119
+
120
+ before do
121
+ Spree::Product.add_simple_scopes(simple_scopes)
122
+ end
123
+
124
+ context 'define scope' do
125
+ context 'ascend_by_updated_at' do
126
+ context 'on class' do
127
+ it { expect(Spree::Product.ascend_by_updated_at.to_sql).to eq Spree::Product.order("#{Spree::Product.quoted_table_name}.updated_at ASC").to_sql }
128
+ end
129
+
130
+ context 'on ActiveRecord::Relation' do
131
+ it { expect(Spree::Product.limit(2).ascend_by_updated_at.to_sql).to eq Spree::Product.limit(2).order("#{Spree::Product.quoted_table_name}.updated_at ASC").to_sql }
132
+ it { expect(Spree::Product.limit(2).ascend_by_updated_at.to_sql).to eq Spree::Product.ascend_by_updated_at.limit(2).to_sql }
133
+ end
134
+ end
135
+
136
+ context 'descend_by_name' do
137
+ context 'on class' do
138
+ it { expect(Spree::Product.descend_by_name.to_sql).to eq Spree::Product.order("#{Spree::Product.quoted_table_name}.name DESC").to_sql }
139
+ end
140
+
141
+ context 'on ActiveRecord::Relation' do
142
+ it { expect(Spree::Product.limit(2).descend_by_name.to_sql).to eq Spree::Product.limit(2).order("#{Spree::Product.quoted_table_name}.name DESC").to_sql }
143
+ it { expect(Spree::Product.limit(2).descend_by_name.to_sql).to eq Spree::Product.descend_by_name.limit(2).to_sql }
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,103 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+
5
+ describe Spree::ProductDuplicator, :type => :model do
6
+
7
+ let(:product) { create(:product, properties: [create(:property, name: "MyProperty")])}
8
+ let!(:duplicator) { Spree::ProductDuplicator.new(product)}
9
+
10
+ let(:image) { File.open(File.expand_path('../../../fixtures/thinking-cat.jpg', __FILE__)) }
11
+ let(:params) { {:viewable_id => product.master.id, :viewable_type => 'Spree::Variant', :attachment => image, :alt => "position 1", :position => 1} }
12
+
13
+ before do
14
+ Spree::Image.create(params)
15
+ end
16
+
17
+ it "will duplicate the product" do
18
+ expect{duplicator.duplicate}.to change{Spree::Product.count}.by(1)
19
+ end
20
+
21
+ context 'when image duplication enabled' do
22
+
23
+ it "will duplicate the product images" do
24
+ expect{duplicator.duplicate}.to change{Spree::Image.count}.by(1)
25
+ end
26
+
27
+ end
28
+
29
+ context 'when image duplication disabled' do
30
+
31
+ let!(:duplicator) { Spree::ProductDuplicator.new(product, false) }
32
+
33
+ it "will not duplicate the product images" do
34
+ expect{duplicator.duplicate}.to change{Spree::Image.count}.by(0)
35
+ end
36
+
37
+ end
38
+
39
+ context 'image duplication default' do
40
+
41
+ context 'when default is set to true' do
42
+
43
+ it 'clones images if no flag passed to initializer' do
44
+ expect{duplicator.duplicate}.to change{Spree::Image.count}.by(1)
45
+ end
46
+
47
+ end
48
+
49
+ context 'when default is set to false' do
50
+
51
+ before do
52
+ ProductDuplicator.clone_images_default = false
53
+ end
54
+
55
+ after do
56
+ ProductDuplicator.clone_images_default = true
57
+ end
58
+
59
+ it 'does not clone images if no flag passed to initializer' do
60
+ expect{ProductDuplicator.new(product).duplicate}.to change{Spree::Image.count}.by(0)
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+
67
+ context "product attributes" do
68
+ let!(:new_product) {duplicator.duplicate}
69
+
70
+ it "will set an unique name" do
71
+ expect(new_product.name).to eql "COPY OF #{product.name}"
72
+ end
73
+
74
+ it "will set an unique sku" do
75
+ expect(new_product.sku).to include "COPY OF SKU"
76
+ end
77
+
78
+ it "copied the properties" do
79
+ expect(new_product.product_properties.count).to be 1
80
+ expect(new_product.product_properties.first.property.name).to eql "MyProperty"
81
+ end
82
+ end
83
+
84
+ context "with variants" do
85
+ let(:option_type) { create(:option_type, name: "MyOptionType")}
86
+ let(:option_value1) { create(:option_value, name: "OptionValue1", option_type: option_type)}
87
+ let(:option_value2) { create(:option_value, name: "OptionValue2", option_type: option_type)}
88
+
89
+ let!(:variant1) { create(:variant, product: product, option_values: [option_value1]) }
90
+ let!(:variant2) { create(:variant, product: product, option_values: [option_value2]) }
91
+
92
+ it "will duplciate the variants" do
93
+ # will change the count by 3, since there will be a master variant as well
94
+ expect{duplicator.duplicate}.to change{Spree::Variant.count}.by(3)
95
+ end
96
+
97
+ it "will not duplicate the option values" do
98
+ expect{duplicator.duplicate}.to change{Spree::OptionValue.count}.by(0)
99
+ end
100
+
101
+ end
102
+ end
103
+ end