spree_core 3.0.10 → 3.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (289) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree.js.coffee.erb +12 -3
  3. data/app/helpers/spree/base_helper.rb +4 -1
  4. data/app/helpers/spree/products_helper.rb +37 -6
  5. data/app/mailers/spree/base_mailer.rb +11 -2
  6. data/app/models/concerns/spree/adjustment_source.rb +3 -10
  7. data/app/models/concerns/spree/default_price.rb +7 -1
  8. data/app/models/concerns/spree/named_type.rb +1 -1
  9. data/app/models/concerns/spree/user_api_authentication.rb +7 -1
  10. data/app/models/concerns/spree/user_methods.rb +47 -0
  11. data/app/models/concerns/spree/user_reporting.rb +2 -2
  12. data/app/models/concerns/spree/vat_price_calculation.rb +47 -0
  13. data/app/models/spree/address.rb +8 -7
  14. data/app/models/spree/adjustable/adjuster/base.rb +25 -0
  15. data/app/models/spree/adjustable/adjuster/promotion.rb +41 -0
  16. data/app/models/spree/adjustable/adjuster/tax.rb +26 -0
  17. data/app/models/spree/adjustable/adjustments_updater.rb +22 -45
  18. data/app/models/spree/adjustment.rb +8 -10
  19. data/app/models/spree/app_configuration.rb +5 -2
  20. data/app/models/spree/base.rb +4 -0
  21. data/app/models/spree/calculator.rb +0 -5
  22. data/app/models/spree/calculator/default_tax.rb +2 -10
  23. data/app/models/spree/classification.rb +7 -3
  24. data/app/models/spree/country.rb +14 -3
  25. data/app/models/spree/credit_card.rb +21 -31
  26. data/app/models/spree/customer_return.rb +7 -15
  27. data/app/models/spree/gateway.rb +7 -6
  28. data/app/models/spree/image.rb +1 -1
  29. data/app/models/spree/inventory_unit.rb +9 -6
  30. data/app/models/spree/legacy_user.rb +1 -6
  31. data/app/models/spree/line_item.rb +69 -68
  32. data/app/models/spree/log_entry.rb +1 -4
  33. data/app/models/spree/option_type.rb +15 -6
  34. data/app/models/spree/option_type_prototype.rb +9 -0
  35. data/app/models/spree/option_value.rb +11 -3
  36. data/app/models/spree/option_value_variant.rb +6 -0
  37. data/app/models/spree/order.rb +113 -64
  38. data/app/models/spree/order/checkout.rb +8 -11
  39. data/app/models/spree/order/currency_updater.rb +1 -1
  40. data/app/models/spree/order/store_credit.rb +96 -0
  41. data/app/models/spree/order_contents.rb +6 -1
  42. data/app/models/spree/order_inventory.rb +4 -8
  43. data/app/models/spree/order_promotion.rb +6 -0
  44. data/app/models/spree/order_updater.rb +2 -7
  45. data/app/models/spree/payment.rb +46 -19
  46. data/app/models/spree/payment/gateway_options.rb +8 -4
  47. data/app/models/spree/payment_method.rb +12 -13
  48. data/app/models/spree/payment_method/store_credit.rb +130 -0
  49. data/app/models/spree/preference.rb +1 -1
  50. data/app/models/spree/price.rb +16 -6
  51. data/app/models/spree/product.rb +52 -49
  52. data/app/models/spree/product/scopes.rb +7 -2
  53. data/app/models/spree/product_option_type.rb +7 -2
  54. data/app/models/spree/product_promotion_rule.rb +9 -0
  55. data/app/models/spree/product_property.rb +8 -10
  56. data/app/models/spree/promotion.rb +19 -19
  57. data/app/models/spree/promotion/rules/product.rb +3 -1
  58. data/app/models/spree/promotion/rules/taxon.rb +2 -1
  59. data/app/models/spree/promotion/rules/user.rb +4 -4
  60. data/app/models/spree/promotion_action.rb +3 -3
  61. data/app/models/spree/promotion_category.rb +1 -1
  62. data/app/models/spree/promotion_rule_taxon.rb +9 -0
  63. data/app/models/spree/promotion_rule_user.rb +9 -0
  64. data/app/models/spree/property.rb +2 -1
  65. data/app/models/spree/property_prototype.rb +9 -0
  66. data/app/models/spree/prototype.rb +8 -3
  67. data/app/models/spree/prototype_taxon.rb +9 -0
  68. data/app/models/spree/refund.rb +10 -7
  69. data/app/models/spree/refund_reason.rb +1 -1
  70. data/app/models/spree/reimbursement.rb +12 -16
  71. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +23 -6
  72. data/app/models/spree/reimbursement_type/store_credit.rb +28 -0
  73. data/app/models/spree/return_authorization.rb +8 -13
  74. data/app/models/spree/return_authorization_reason.rb +1 -1
  75. data/app/models/spree/return_item.rb +13 -12
  76. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
  77. data/app/models/spree/role.rb +3 -2
  78. data/app/models/spree/role_user.rb +6 -0
  79. data/app/models/spree/shipment.rb +18 -23
  80. data/app/models/spree/shipment_handler.rb +2 -2
  81. data/app/models/spree/shipping_category.rb +6 -3
  82. data/app/models/spree/shipping_method.rb +11 -10
  83. data/app/models/spree/shipping_method_zone.rb +6 -0
  84. data/app/models/spree/shipping_rate.rb +16 -29
  85. data/app/models/spree/state.rb +3 -2
  86. data/app/models/spree/state_change.rb +1 -1
  87. data/app/models/spree/stock/content_item.rb +10 -12
  88. data/app/models/spree/stock/coordinator.rb +13 -14
  89. data/app/models/spree/stock/estimator.rb +28 -30
  90. data/app/models/spree/stock/inventory_unit_builder.rb +1 -9
  91. data/app/models/spree/stock/packer.rb +1 -1
  92. data/app/models/spree/stock/quantifier.rb +5 -5
  93. data/app/models/spree/stock/splitter/backordered.rb +2 -2
  94. data/app/models/spree/stock_item.rb +12 -18
  95. data/app/models/spree/stock_location.rb +4 -7
  96. data/app/models/spree/stock_movement.rb +11 -9
  97. data/app/models/spree/stock_transfer.rb +11 -12
  98. data/app/models/spree/store.rb +14 -6
  99. data/app/models/spree/store_credit.rb +252 -0
  100. data/app/models/spree/store_credit_category.rb +22 -0
  101. data/app/models/spree/store_credit_event.rb +38 -0
  102. data/app/models/spree/store_credit_type.rb +6 -0
  103. data/app/models/spree/tax_category.rb +3 -8
  104. data/app/models/spree/tax_rate.rb +56 -122
  105. data/app/models/spree/taxon.rb +11 -5
  106. data/app/models/spree/tracker.rb +12 -1
  107. data/app/models/spree/validations/db_maximum_length_validator.rb +2 -1
  108. data/app/models/spree/variant.rb +82 -50
  109. data/app/models/spree/zone.rb +21 -17
  110. data/app/models/spree/zone_member.rb +6 -0
  111. data/app/validators/db_maximum_length_validator.rb +11 -0
  112. data/app/views/layouts/spree/base_mailer.html.erb +38 -781
  113. data/app/views/spree/order_mailer/_adjustment.html.erb +8 -0
  114. data/app/views/spree/order_mailer/_subtotal.html.erb +8 -0
  115. data/app/views/spree/order_mailer/_total.html.erb +8 -0
  116. data/app/views/spree/order_mailer/cancel_email.html.erb +13 -28
  117. data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
  118. data/app/views/spree/order_mailer/confirm_email.html.erb +49 -63
  119. data/app/views/spree/order_mailer/confirm_email.text.erb +1 -1
  120. data/app/views/spree/shared/_base_mailer_header.html.erb +5 -7
  121. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +777 -0
  122. data/app/views/spree/shared/_error_messages.html.erb +1 -1
  123. data/app/views/spree/shared/_mailer_line_item.html.erb +12 -0
  124. data/app/views/spree/shipment_mailer/shipped_email.html.erb +21 -14
  125. data/app/views/spree/shipment_mailer/shipped_email.text.erb +3 -3
  126. data/config/initializers/user_class_extensions.rb +7 -38
  127. data/config/locales/en.yml +113 -13
  128. data/config/routes.rb +7 -0
  129. data/db/default/spree/default_reimbursement_type.rb +1 -1
  130. data/db/default/spree/zones.rb +4 -5
  131. data/db/migrate/20150118210639_create_spree_store_credits.rb +24 -0
  132. data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +8 -0
  133. data/db/migrate/20150118212051_create_spree_store_credit_events.rb +17 -0
  134. data/db/migrate/20150118212101_create_spree_store_credit_types.rb +10 -0
  135. data/db/migrate/20150314013438_add_missing_indexes.rb +25 -0
  136. data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +18 -0
  137. data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +14 -0
  138. data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +5 -0
  139. data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +19 -0
  140. data/db/migrate/20150627090949_migrate_payment_methods_display.rb +12 -0
  141. data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +12 -0
  142. data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +18 -0
  143. data/db/migrate/20150727191614_spree_store_credit_types.rb +11 -0
  144. data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +68 -0
  145. data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +13 -0
  146. data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +16 -0
  147. data/db/migrate/20160219165458_add_indexes.rb +14 -0
  148. data/lib/generators/spree/dummy/templates/rails/database.yml +31 -24
  149. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -1
  150. data/lib/spree/core.rb +16 -0
  151. data/lib/spree/core/controller_helpers/auth.rb +1 -1
  152. data/lib/spree/core/controller_helpers/common.rb +3 -3
  153. data/lib/spree/core/controller_helpers/order.rb +6 -5
  154. data/lib/spree/core/controller_helpers/search.rb +1 -1
  155. data/lib/spree/core/controller_helpers/store.rb +29 -0
  156. data/lib/spree/core/delegate_belongs_to.rb +2 -2
  157. data/lib/spree/core/engine.rb +30 -25
  158. data/lib/spree/core/environment.rb +1 -1
  159. data/lib/spree/core/importer/order.rb +37 -40
  160. data/lib/spree/core/number_generator.rb +52 -0
  161. data/lib/spree/core/product_filters.rb +1 -1
  162. data/lib/spree/core/search/base.rb +4 -3
  163. data/lib/spree/core/version.rb +1 -1
  164. data/lib/spree/localized_number.rb +3 -1
  165. data/lib/spree/permitted_attributes.rb +5 -2
  166. data/lib/spree/testing_support/common_rake.rb +3 -3
  167. data/lib/spree/testing_support/factories.rb +3 -3
  168. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  169. data/lib/spree/testing_support/factories/country_factory.rb +2 -2
  170. data/lib/spree/testing_support/factories/order_factory.rb +2 -2
  171. data/lib/spree/testing_support/factories/payment_factory.rb +5 -0
  172. data/lib/spree/testing_support/factories/payment_method_factory.rb +8 -0
  173. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +5 -0
  174. data/lib/spree/testing_support/factories/refund_factory.rb +9 -1
  175. data/lib/spree/testing_support/factories/return_authorization_factory.rb +2 -0
  176. data/lib/spree/testing_support/factories/state_factory.rb +2 -2
  177. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +9 -0
  178. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -0
  179. data/lib/spree/testing_support/factories/store_credit_factory.rb +17 -0
  180. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +11 -0
  181. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  182. data/lib/spree/testing_support/factories/zone_member_factory.rb +6 -0
  183. data/lib/spree/testing_support/microdata.rb +189 -0
  184. data/lib/tasks/core.rake +68 -0
  185. data/lib/tasks/exchanges.rake +2 -2
  186. data/spec/fixtures/microdata.html +22 -0
  187. data/spec/fixtures/microdata_itemref.html +15 -0
  188. data/spec/fixtures/microdata_no_itemscope.html +20 -0
  189. data/spec/helpers/base_helper_spec.rb +64 -1
  190. data/spec/helpers/products_helper_spec.rb +75 -3
  191. data/spec/lib/i18n_spec.rb +2 -2
  192. data/spec/lib/search/base_spec.rb +2 -2
  193. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +4 -2
  194. data/spec/lib/spree/core/controller_helpers/store_spec.rb +56 -0
  195. data/spec/lib/spree/core/importer/order_spec.rb +226 -123
  196. data/spec/lib/spree/core/number_generator_spec.rb +175 -0
  197. data/spec/lib/spree/core_spec.rb +23 -0
  198. data/spec/lib/spree/localized_number_spec.rb +10 -0
  199. data/spec/mailers/order_mailer_spec.rb +11 -13
  200. data/spec/mailers/shipment_mailer_spec.rb +26 -8
  201. data/spec/mailers/test_mailer_spec.rb +15 -1
  202. data/spec/models/option_type_prototype_spec.rb +9 -0
  203. data/spec/models/spree/ability_spec.rb +6 -13
  204. data/spec/models/spree/address_spec.rb +1 -1
  205. data/spec/models/spree/adjustable/adjuster/base_spec.rb +10 -0
  206. data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +211 -0
  207. data/spec/models/spree/adjustable/adjuster/tax_spec.rb +86 -0
  208. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +2 -262
  209. data/spec/models/spree/adjustment_spec.rb +27 -1
  210. data/spec/models/spree/app_configuration_spec.rb +5 -2
  211. data/spec/models/spree/calculator/default_tax_spec.rb +39 -14
  212. data/spec/models/spree/concerns/user_methods_spec.rb +55 -0
  213. data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
  214. data/spec/models/spree/country_spec.rb +45 -8
  215. data/spec/models/spree/credit_card_spec.rb +8 -8
  216. data/spec/models/spree/customer_return_spec.rb +4 -26
  217. data/spec/models/spree/gateway_spec.rb +7 -0
  218. data/spec/models/spree/image_spec.rb +3 -0
  219. data/spec/models/spree/inventory_unit_spec.rb +1 -18
  220. data/spec/models/spree/line_item_spec.rb +78 -18
  221. data/spec/models/spree/option_type_spec.rb +2 -2
  222. data/spec/models/spree/option_value_spec.rb +8 -3
  223. data/spec/models/spree/order/checkout_spec.rb +49 -39
  224. data/spec/models/spree/order/currency_updater_spec.rb +3 -3
  225. data/spec/models/spree/order/finalizing_spec.rb +0 -3
  226. data/spec/models/spree/order/payment_spec.rb +1 -1
  227. data/spec/models/spree/order/state_machine_spec.rb +1 -6
  228. data/spec/models/spree/order/store_credit_spec.rb +423 -0
  229. data/spec/models/spree/order/updating_spec.rb +2 -2
  230. data/spec/models/spree/order_contents_spec.rb +42 -1
  231. data/spec/models/spree/order_inventory_spec.rb +27 -17
  232. data/spec/models/spree/order_spec.rb +65 -52
  233. data/spec/models/spree/payment/gateway_options_spec.rb +10 -2
  234. data/spec/models/spree/payment/store_credit_spec.rb +60 -0
  235. data/spec/models/spree/payment_method/store_credit_spec.rb +291 -0
  236. data/spec/models/spree/payment_method_spec.rb +22 -14
  237. data/spec/models/spree/payment_spec.rb +37 -44
  238. data/spec/models/spree/price_spec.rb +86 -0
  239. data/spec/models/spree/product/scopes_spec.rb +35 -0
  240. data/spec/models/spree/product_option_type_spec.rb +6 -2
  241. data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
  242. data/spec/models/spree/product_property_spec.rb +11 -0
  243. data/spec/models/spree/product_spec.rb +82 -15
  244. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +1 -1
  245. data/spec/models/spree/promotion/rules/user_spec.rb +8 -0
  246. data/spec/models/spree/promotion_action_spec.rb +1 -1
  247. data/spec/models/spree/promotion_rule_spec.rb +1 -1
  248. data/spec/models/spree/promotion_rule_taxon_spec.rb +9 -0
  249. data/spec/models/spree/promotion_rule_user_spec.rb +9 -0
  250. data/spec/models/spree/promotion_spec.rb +57 -36
  251. data/spec/models/spree/property_prototype_spec.rb +9 -0
  252. data/spec/models/spree/prototype_taxon_spec.rb +9 -0
  253. data/spec/models/spree/refund_reason_spec.rb +7 -0
  254. data/spec/models/spree/reimbursement_spec.rb +3 -30
  255. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +17 -5
  256. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +101 -0
  257. data/spec/models/spree/return_authorization_reason_spec.rb +7 -0
  258. data/spec/models/spree/return_authorization_spec.rb +2 -22
  259. data/spec/models/spree/return_item_spec.rb +50 -1
  260. data/spec/models/spree/returns_calculator_spec.rb +1 -1
  261. data/spec/models/spree/role_spec.rb +7 -0
  262. data/spec/models/spree/shipment_spec.rb +17 -17
  263. data/spec/models/spree/shipping_calculator_spec.rb +2 -2
  264. data/spec/models/spree/shipping_category_spec.rb +14 -0
  265. data/spec/models/spree/shipping_method_spec.rb +9 -2
  266. data/spec/models/spree/shipping_rate_spec.rb +40 -41
  267. data/spec/models/spree/state_spec.rb +12 -1
  268. data/spec/models/spree/stock/content_item_spec.rb +9 -0
  269. data/spec/models/spree/stock/estimator_spec.rb +56 -8
  270. data/spec/models/spree/stock/quantifier_spec.rb +61 -32
  271. data/spec/models/spree/stock_item_spec.rb +19 -1
  272. data/spec/models/spree/store_credit_event_spec.rb +101 -0
  273. data/spec/models/spree/store_credit_spec.rb +786 -0
  274. data/spec/models/spree/store_spec.rb +39 -11
  275. data/spec/models/spree/tax_category_spec.rb +6 -1
  276. data/spec/models/spree/tax_rate_spec.rb +204 -44
  277. data/spec/models/spree/user_spec.rb +105 -38
  278. data/spec/models/spree/variant_spec.rb +281 -9
  279. data/spec/models/spree/zone_member_spec.rb +38 -0
  280. data/spec/models/spree/zone_spec.rb +32 -8
  281. data/spec/spec_helper.rb +3 -0
  282. data/spec/support/concerns/{adjustment_source_spec.rb → adjustment_source.rb} +0 -0
  283. data/spec/support/concerns/{default_price_spec.rb → default_price.rb} +9 -0
  284. data/spec/validators/db_maximum_length_validator_spec.rb +22 -0
  285. data/spree_core.gemspec +5 -6
  286. metadata +99 -36
  287. data/CHANGELOG.md +0 -4
  288. data/app/models/concerns/spree/number_generator.rb +0 -39
  289. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -24
@@ -120,7 +120,7 @@ module Spree
120
120
  end
121
121
 
122
122
  it "nullifies adjustments for completed orders" do
123
- order = Order.create(completed_at: Time.now)
123
+ order = Order.create(completed_at: Time.current)
124
124
  adjustment = action.adjustments.create!(label: "Check",
125
125
  amount: 0,
126
126
  order: order,
@@ -2,6 +2,14 @@ require 'spec_helper'
2
2
 
3
3
  describe Spree::Promotion::Rules::User, :type => :model do
4
4
  let(:rule) { Spree::Promotion::Rules::User.new }
5
+ let(:test_user) { create :user }
6
+
7
+ describe 'Associations' do
8
+ it 'should have many promotion_rule_users' do
9
+ is_expected.to have_many(:promotion_rule_users).with_foreign_key(:promotion_rule_id).
10
+ class_name('Spree::PromotionRuleUser').dependent(:destroy)
11
+ end
12
+ end
5
13
 
6
14
  context "#eligible?(order)" do
7
15
  let(:order) { Spree::Order.new }
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Spree::PromotionAction, :type => :model do
4
4
 
5
5
  it "should force developer to implement 'perform' method" do
6
- expect { MyAction.new.perform }.to raise_error
6
+ expect { MyAction.new.perform }.to raise_error(NameError)
7
7
  end
8
8
 
9
9
  end
@@ -12,7 +12,7 @@ module Spree
12
12
  end
13
13
 
14
14
  it "should force developer to implement eligible? method" do
15
- expect { BadTestRule.new.eligible? }.to raise_error
15
+ expect { BadTestRule.new.eligible? }.to raise_error(ArgumentError)
16
16
  end
17
17
 
18
18
  it "validates unique rules for a promotion" do
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PromotionRuleTaxon do
4
+ describe 'Validations' do
5
+ it { is_expected.to validate_presence_of(:promotion_rule) }
6
+ it { is_expected.to validate_presence_of(:taxon) }
7
+ it { is_expected.to validate_uniqueness_of(:promotion_rule_id).scoped_to(:taxon_id).allow_nil }
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PromotionRuleUser do
4
+ describe 'Validations' do
5
+ it { is_expected.to validate_presence_of(:promotion_rule) }
6
+ it { is_expected.to validate_presence_of(:user) }
7
+ it { is_expected.to validate_uniqueness_of(:user_id).scoped_to(:promotion_rule_id).allow_nil }
8
+ end
9
+ end
@@ -26,34 +26,55 @@ describe Spree::Promotion, :type => :model do
26
26
  end
27
27
  end
28
28
 
29
- describe ".coupons" do
30
- it "scopes promotions with coupon code present only" do
31
- promotion = Spree::Promotion.create! name: "test", code: ''
32
- expect(Spree::Promotion.coupons).to be_empty
29
+ describe 'scopes' do
30
+ describe '.coupons' do
31
+ let!(:promotion_without_code) { Spree::Promotion.create! name: 'test', code: '' }
32
+ let!(:promotion_with_code) { Spree::Promotion.create! name: 'test1', code: 'code' }
33
33
 
34
- promotion.update_column :code, "check"
35
- expect(Spree::Promotion.coupons.first).to eq promotion
34
+ subject { Spree::Promotion.coupons }
35
+
36
+ it 'is expected to not include promotion without code' do
37
+ is_expected.to_not include(promotion_without_code)
38
+ end
39
+
40
+ it 'is expected to include promotion with code' do
41
+ is_expected.to include(promotion_with_code)
42
+ end
36
43
  end
37
- end
38
44
 
39
- describe ".applied" do
40
- it "scopes promotions that have been applied to an order only" do
41
- promotion = Spree::Promotion.create! name: "test", code: ''
42
- expect(Spree::Promotion.applied).to be_empty
45
+ describe '.applied' do
46
+ let!(:promotion_not_applied) { Spree::Promotion.create! name: 'test', code: '' }
47
+ let(:order) { create(:order) }
48
+ let!(:promotion_applied) do
49
+ promotion = Spree::Promotion.create!(name: 'test1', code: '')
50
+ promotion.orders << order
51
+ promotion
52
+ end
53
+
54
+ subject { Spree::Promotion.applied }
55
+
56
+ it 'is expected to not include promotion not applied' do
57
+ is_expected.to_not include(promotion_not_applied)
58
+ end
43
59
 
44
- promotion.orders << create(:order)
45
- expect(Spree::Promotion.applied.first).to eq promotion
60
+ it 'is expected to include promotion applied' do
61
+ is_expected.to include(promotion_applied)
62
+ end
46
63
  end
47
- end
48
64
 
49
- describe ".advertised" do
50
- let(:promotion) { create(:promotion) }
51
- let(:advertised_promotion) { create(:promotion, :advertise => true) }
65
+ describe '.advertised' do
66
+ let!(:promotion_not_advertised) { Spree::Promotion.create! name: 'test', advertise: false }
67
+ let!(:promotion_advertised) { Spree::Promotion.create! name: 'test1', advertise: true }
52
68
 
53
- it "only shows advertised promotions" do
54
- advertised = Spree::Promotion.advertised
55
- expect(advertised).to include(advertised_promotion)
56
- expect(advertised).not_to include(promotion)
69
+ subject { Spree::Promotion.advertised }
70
+
71
+ it 'is expected to not include promotion not advertised' do
72
+ is_expected.to_not include(promotion_not_advertised)
73
+ end
74
+
75
+ it 'is expected to include promotion advertised' do
76
+ is_expected.to include(promotion_advertised)
77
+ end
57
78
  end
58
79
  end
59
80
 
@@ -130,7 +151,7 @@ describe Spree::Promotion, :type => :model do
130
151
 
131
152
  it "does activate if newer then order" do
132
153
  expect(@action1).to receive(:perform).with(@payload)
133
- promotion.created_at = DateTime.now + 2
154
+ promotion.created_at = DateTime.current + 2
134
155
  expect(promotion.activate(@payload)).to be true
135
156
  end
136
157
 
@@ -178,28 +199,28 @@ describe Spree::Promotion, :type => :model do
178
199
  end
179
200
 
180
201
  it "should be expired if it hasn't started yet" do
181
- promotion.starts_at = Time.now + 1.day
202
+ promotion.starts_at = Time.current + 1.day
182
203
  expect(promotion).to be_expired
183
204
  end
184
205
 
185
206
  it "should be expired if it has already ended" do
186
- promotion.expires_at = Time.now - 1.day
207
+ promotion.expires_at = Time.current - 1.day
187
208
  expect(promotion).to be_expired
188
209
  end
189
210
 
190
211
  it "should not be expired if it has started already" do
191
- promotion.starts_at = Time.now - 1.day
212
+ promotion.starts_at = Time.current - 1.day
192
213
  expect(promotion).not_to be_expired
193
214
  end
194
215
 
195
216
  it "should not be expired if it has not ended yet" do
196
- promotion.expires_at = Time.now + 1.day
217
+ promotion.expires_at = Time.current + 1.day
197
218
  expect(promotion).not_to be_expired
198
219
  end
199
220
 
200
221
  it "should not be expired if current time is within starts_at and expires_at range" do
201
- promotion.starts_at = Time.now - 1.day
202
- promotion.expires_at = Time.now + 1.day
222
+ promotion.starts_at = Time.current - 1.day
223
+ promotion.expires_at = Time.current + 1.day
203
224
  expect(promotion).not_to be_expired
204
225
  end
205
226
 
@@ -297,15 +318,15 @@ describe Spree::Promotion, :type => :model do
297
318
  end
298
319
 
299
320
  context "#products" do
321
+ let(:product) { create(:product) }
300
322
  let(:promotion) { create(:promotion) }
301
323
 
302
324
  context "when it has product rules with products associated" do
303
- let(:promotion_rule) { Spree::Promotion::Rules::Product.new }
325
+ let(:promotion_rule) { create(:promotion_rule, promotion: promotion, type: 'Spree::Promotion::Rules::Product') }
304
326
 
305
327
  before do
306
- promotion_rule.promotion = promotion
307
- promotion_rule.products << create(:product)
308
- promotion_rule.save
328
+ promotion.promotion_rules << promotion_rule
329
+ product.product_promotion_rules.create(promotion_rule_id: promotion_rule.id)
309
330
  end
310
331
 
311
332
  it "should have products" do
@@ -324,7 +345,7 @@ describe Spree::Promotion, :type => :model do
324
345
  let(:promotable) { create :order }
325
346
  subject { promotion.eligible?(promotable) }
326
347
  context "when promotion is expired" do
327
- before { promotion.expires_at = Time.now - 10.days }
348
+ before { promotion.expires_at = Time.current - 10.days }
328
349
  it { is_expected.to be false }
329
350
  end
330
351
  context "when promotable is a Spree::LineItem" do
@@ -541,8 +562,8 @@ describe Spree::Promotion, :type => :model do
541
562
  context 'when the user has used this promo' do
542
563
  before do
543
564
  promotion.activate(order: order)
544
- order.update!
545
- order.completed_at = Time.now
565
+ order.update_with_updater!
566
+ order.completed_at = Time.current
546
567
  order.save!
547
568
  end
548
569
 
@@ -588,7 +609,7 @@ describe Spree::Promotion, :type => :model do
588
609
  expect(order.adjustment_total).to eq 0
589
610
 
590
611
  promo.activate order: order
591
- order.update!
612
+ order.update_with_updater!
592
613
 
593
614
  expect(line_item.adjustments.size).to eq(1)
594
615
  expect(order.adjustment_total).to eq -5
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PropertyPrototype do
4
+ describe 'Validations' do
5
+ it { is_expected.to validate_presence_of(:prototype) }
6
+ it { is_expected.to validate_presence_of(:property) }
7
+ it { is_expected.to validate_uniqueness_of(:prototype_id).scoped_to(:property_id).allow_nil }
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PrototypeTaxon do
4
+ describe 'Validations' do
5
+ it { is_expected.to validate_presence_of(:prototype) }
6
+ it { is_expected.to validate_presence_of(:taxon) }
7
+ it { is_expected.to validate_uniqueness_of(:prototype_id).scoped_to(:taxon_id).allow_nil }
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::RefundReason do
4
+ describe 'Associations' do
5
+ it { is_expected.to have_many(:refunds).dependent(:restrict_with_error) }
6
+ end
7
+ end
@@ -2,33 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe Spree::Reimbursement, type: :model do
4
4
 
5
- describe ".before_create" do
6
- describe "#generate_number" do
7
- context "number is assigned" do
8
- let(:number) { '123' }
9
- let(:reimbursement) { Spree::Reimbursement.new(number: number) }
10
-
11
- it "should return the assigned number" do
12
- reimbursement.save
13
- expect(reimbursement.number).to eq number
14
- end
15
- end
16
-
17
- context "number is not assigned" do
18
- let(:reimbursement) { Spree::Reimbursement.new(number: nil) }
19
-
20
- before do
21
- allow(reimbursement).to receive_messages(valid?: true)
22
- end
23
-
24
- it "should assign number with random RI number" do
25
- reimbursement.save
26
- expect(reimbursement.number).to be =~ /RI\d{9}/
27
- end
28
- end
29
- end
30
- end
31
-
32
5
  describe "#display_total" do
33
6
  let(:total) { 100.50 }
34
7
  let(:currency) { "USD" }
@@ -50,7 +23,7 @@ describe Spree::Reimbursement, type: :model do
50
23
  let!(:adjustments) { [] } # placeholder to ensure it gets run prior the "before" at this level
51
24
 
52
25
  let!(:tax_rate) { nil }
53
- let!(:tax_zone) { create(:zone, default_tax: true) }
26
+ let!(:tax_zone) { create(:zone_with_country, default_tax: true) }
54
27
 
55
28
  let(:order) { create(:order_with_line_items, state: 'payment', line_items_count: 1, line_items_price: line_items_price, shipment_cost: 0) }
56
29
  let(:line_items_price) { BigDecimal.new(10) }
@@ -73,7 +46,7 @@ describe Spree::Reimbursement, type: :model do
73
46
  shipment.update_column('state', 'shipped')
74
47
  end
75
48
  order.reload
76
- order.update!
49
+ order.update_with_updater!
77
50
  if payment
78
51
  payment.save!
79
52
  order.next! # confirm
@@ -118,7 +91,7 @@ describe Spree::Reimbursement, type: :model do
118
91
  subject
119
92
  }.to change { Spree::Refund.count }.by(1)
120
93
  return_item.reload
121
- expect(return_item.included_tax_total).to be < 0
94
+ expect(return_item.included_tax_total).to be > 0
122
95
  expect(return_item.included_tax_total).to eq line_item.included_tax_total
123
96
  expect(reimbursement.total).to eq (line_item.pre_tax_amount + line_item.included_tax_total).round(2)
124
97
  expect(Spree::Refund.last.amount).to eq (line_item.pre_tax_amount + line_item.included_tax_total).round(2)
@@ -24,8 +24,14 @@ describe Spree::ReimbursementTaxCalculator, :type => :model do
24
24
  end
25
25
 
26
26
  context 'with additional tax' do
27
- let!(:tax_rate) { create(:tax_rate, name: "Sales Tax", amount: 0.10, included_in_price: false, zone: tax_zone) }
28
- let(:tax_zone) { create(:zone, default_tax: true) }
27
+ let!(:tax_rate) do
28
+ create :tax_rate,
29
+ name: "Sales Tax",
30
+ amount: 0.10,
31
+ included_in_price: false,
32
+ tax_category: create(:tax_category),
33
+ zone: create(:zone_with_country, default_tax: true)
34
+ end
29
35
 
30
36
  it 'sets additional_tax_total on the return items' do
31
37
  subject
@@ -37,14 +43,20 @@ describe Spree::ReimbursementTaxCalculator, :type => :model do
37
43
  end
38
44
 
39
45
  context 'with included tax' do
40
- let!(:tax_rate) { create(:tax_rate, name: "VAT Tax", amount: 0.1, included_in_price: true, zone: tax_zone) }
41
- let(:tax_zone) { create(:zone, default_tax: true) }
46
+ let!(:tax_rate) do
47
+ create :tax_rate,
48
+ name: "VAT Tax",
49
+ amount: 0.10,
50
+ included_in_price: true,
51
+ tax_category: create(:tax_category),
52
+ zone: create(:zone_with_country, default_tax: true)
53
+ end
42
54
 
43
55
  it 'sets included_tax_total on the return items' do
44
56
  subject
45
57
  return_item.reload
46
58
 
47
- expect(return_item.included_tax_total).to be < 0
59
+ expect(return_item.included_tax_total).to be > 0
48
60
  expect(return_item.included_tax_total).to eq line_item.included_tax_total
49
61
  end
50
62
  end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe ReimbursementType::StoreCredit do
5
+ let(:reimbursement) { create(:reimbursement, return_items_count: 2) }
6
+ let(:return_item) { reimbursement.return_items.first }
7
+ let(:return_item2) { reimbursement.return_items.last }
8
+ let(:payment) { reimbursement.order.payments.first }
9
+ let(:simulate) { false }
10
+ let!(:default_refund_reason) do
11
+ Spree::RefundReason.find_or_create_by!(name: Spree::RefundReason::RETURN_PROCESSING_REASON,
12
+ mutable: false)
13
+ end
14
+
15
+ let!(:primary_credit_type) { create(:primary_credit_type) }
16
+ let!(:created_by_user) { create(:user, email: Spree::StoreCredit::DEFAULT_CREATED_BY_EMAIL) }
17
+ let!(:default_reimbursement_category) { create(:store_credit_category) }
18
+
19
+ subject do
20
+ Spree::ReimbursementType::StoreCredit.reimburse(reimbursement, [return_item, return_item2],
21
+ simulate)
22
+ end
23
+
24
+ before { reimbursement.update!(total: reimbursement.calculated_total) }
25
+
26
+ describe '.reimburse' do
27
+ context 'simulate is true' do
28
+ let(:simulate) { true }
29
+
30
+ context 'for store credits that the customer used' do
31
+ before do
32
+ allow(Spree::ReimbursementType::StoreCredit).to receive(:store_credit_payments).and_return([payment])
33
+ end
34
+
35
+ it 'creates readonly refunds for all store credit payments' do
36
+ expect(subject.map(&:class)).to eq [Spree::Refund]
37
+ expect(subject.map(&:readonly?)).to eq [true]
38
+ end
39
+
40
+ it 'does not save to the database' do
41
+ expect { subject }.to_not change { payment.refunds.count }
42
+ end
43
+ end
44
+
45
+ context 'for return items that were not paid for with store credit' do
46
+ before do
47
+ allow(Spree::ReimbursementType::StoreCredit).to receive(:store_credit_payments).and_return([])
48
+ end
49
+
50
+ context 'creates one readonly lump credit for all outstanding balance payable to the customer' do
51
+ it 'creates a credit that is read only' do
52
+ expect(subject.map(&:class)).to eq [Spree::Reimbursement::Credit]
53
+ expect(subject.map(&:readonly?)).to eq [true]
54
+ end
55
+
56
+ it 'creates a credit which amounts to the sum of the return items rounded down' do
57
+ allow(return_item).to receive(:total).and_return(10.0076)
58
+ allow(return_item2).to receive(:total).and_return(10.0023)
59
+ expect(subject.sum(&:amount)).to eq 20.0
60
+ end
61
+ end
62
+
63
+ it 'does not save to the database' do
64
+ expect { subject }.to_not change { Spree::Reimbursement::Credit.count }
65
+ end
66
+ end
67
+ end
68
+
69
+ context 'simulate is false' do
70
+ let(:simulate) { false }
71
+
72
+ context 'for store credits that the customer used' do
73
+ before do
74
+ allow(Spree::ReimbursementType::StoreCredit).to receive(:store_credit_payments).and_return([payment])
75
+ end
76
+
77
+ it 'performs refunds for all store credit payments' do
78
+ expect { subject }.to change { payment.refunds.count }.by(1)
79
+ expect(payment.refunds.sum(:amount)).to eq reimbursement.return_items.to_a.sum(&:total)
80
+ end
81
+ end
82
+
83
+ context 'for return items that were not paid for with store credit' do
84
+ before do
85
+ allow(Spree::ReimbursementType::StoreCredit).to receive(:store_credit_payments).and_return([])
86
+ end
87
+
88
+ it 'creates one lump credit for all outstanding balance payable to the customer' do
89
+ expect { subject }.to change { Spree::Reimbursement::Credit.count }.by(1)
90
+ expect(subject.sum(&:amount)).to eq reimbursement.return_items.to_a.sum(&:total)
91
+ end
92
+
93
+ it "creates a store credit with the same currency as the reimbursement's order" do
94
+ expect { subject }.to change { Spree::StoreCredit.count }.by(1)
95
+ expect(Spree::StoreCredit.last.currency).to eq reimbursement.order.currency
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end