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,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,46 @@
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 but not cache fallback value when persistence is disabled" do
36
+ Rails.cache.clear
37
+ allow(@store).to receive_messages(:should_persist? => false)
38
+ expect(@store.get(:test){ true }).to be true
39
+ expect(Rails.cache.exist?(:test)).to be false
40
+ end
41
+
42
+ it "should return nil when key can't be found and fallback value is not supplied" do
43
+ expect(@store.get(:random_key){ nil }).to be_nil
44
+ end
45
+
46
+ 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 maximum amount' do
26
+ let(:amount) { Spree::Price::MAXIMUM_AMOUNT + 1 }
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 #{Spree::Price::MAXIMUM_AMOUNT}"
34
+ end
35
+ end
36
+
37
+ context 'when the amount is between 0 and the maximum amount' do
38
+ let(:amount) { Spree::Price::MAXIMUM_AMOUNT }
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
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'spree/core/product_filters'
3
+
4
+ describe 'product filters', :type => :model do
5
+ # Regression test for #1709
6
+ context 'finds products filtered by brand' do
7
+ let(:product) { create(:product) }
8
+ before do
9
+ property = Spree::Property.create!(:name => "brand", :presentation => "brand")
10
+ product.set_property("brand", "Nike")
11
+ end
12
+
13
+ it "does not attempt to call value method on Arel::Table" do
14
+ expect { Spree::Core::ProductFilters.brand_filter }.not_to raise_error
15
+ end
16
+
17
+ it "can find products in the 'Nike' brand" do
18
+ expect(Spree::Product.brand_any("Nike")).to include(product)
19
+ end
20
+ it "sorts products without brand specified" do
21
+ product.set_property("brand", "Nike")
22
+ create(:product).set_property("brand", nil)
23
+ expect { Spree::Core::ProductFilters.brand_filter[:labels] }.not_to raise_error
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::ProductOptionType, :type => :model do
4
+
5
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::ProductProperty, :type => :model do
4
+ context "touching" do
5
+ it "should update product" do
6
+ pp = create(:product_property)
7
+ expect(pp.product).to receive(:touch)
8
+ pp.touch
9
+ end
10
+ end
11
+ end