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
data/lib/tasks/core.rake CHANGED
@@ -98,4 +98,72 @@ use rake db:load_file[/absolute/path/to/sample/filename.rb]}
98
98
  puts "Bootstrap Complete.\n\n"
99
99
  end
100
100
 
101
+
102
+
103
+ desc "Fix orphan line items after upgrading to Spree 3.1: only needed if you have line items attached to deleted records with Slug (product) and SKU (variant) duplicates of non-deleted records."
104
+ task :fix_orphan_line_items => :environment do |t, args|
105
+ def get_input
106
+ STDOUT.flush
107
+ input = STDIN.gets.chomp
108
+ case input.upcase
109
+ when "Y"
110
+ return true
111
+
112
+ when "N"
113
+ puts "aborting ....."
114
+ return false
115
+ else
116
+ return true
117
+ end
118
+ end
119
+
120
+ puts "WARNING: This task will re-associate any line_items associated with deleted variants to non-deleted variants with matching SKUs. Because other attributes and product associations may switch during the re-association, this may have unintended side-effects. If this task finishes successfully, line items for old order should no longer be orphaned from their varaints. You should run this task after you have already run the db migratoin AddDiscontinuedToProductsAndVariants. If the db migration did not warn you that it was leaving deleted records in place because of duplicate SKUs, then you do not need to run this rake task."
121
+ puts "Are you sure you want to continue? (Y/n):"
122
+
123
+ if get_input
124
+ puts "looping through all your deleted variants ..."
125
+
126
+ # first verify that I can really fix all of your line items
127
+
128
+ no_live_variants_found = []
129
+ variants_to_fix = []
130
+
131
+ Spree::Variant.deleted.each do |variant|
132
+ # check if this variant has any line items at all
133
+ if !variant.line_items.any?
134
+ next
135
+ end
136
+
137
+ variants_to_fix << variant
138
+ dup_variant = Spree::Variant.find_by(sku: variant.sku)
139
+ if dup_variant
140
+ # this variant is OK
141
+ else
142
+ no_live_variants_found << variant
143
+ end
144
+ end
145
+
146
+ if !variants_to_fix.any?
147
+ abort( "ABORT: You have no deleted variants that are associated to line items. You do not need to run this raks task.")
148
+ end
149
+
150
+ if no_live_variants_found.any?
151
+ puts "ABORT: Unfortunately, I found some deleted variants in your database that do not have matching non-deleted variants to replace them with. This script can only be used to cleanup deleted variants that have SKUs that match non-deleted variants. To continue, you must either (1) un-delete these variants (hint: mark them 'discontinued' instead) or (2) create new variants with a matching SKU for each variant in the list below."
152
+ no_live_variants_found.each do |deleted_variant|
153
+ puts "variant id #{deleted_variant.id} (sku is '#{deleted_variant.sku}') ... no match found"
154
+ end
155
+ abort()
156
+ end
157
+
158
+
159
+ puts "Ready to fix..."
160
+ variants_to_fix.each do |variant|
161
+ dup_variant = Spree::Variant.find_by(sku: variant.sku)
162
+ puts "Changing all line items for #{variant.sku} variant id #{variant.id} (deleted) to variant id #{dup_variant.id} (not deleted) ..."
163
+ Spree::LineItem.unscoped.where(variant_id: variant.id).update_all(variant_id: dup_variant.id)
164
+ end
165
+
166
+ puts "DONE ! Your database should no longer have line items that are associated with deleted variants."
167
+ end
168
+ end
101
169
  end
@@ -35,7 +35,7 @@ namespace :exchanges do
35
35
  variant_inventory_units.each { |i| i.update_attributes!(line_item_id: line_item.id, order_id: order.id) }
36
36
  end
37
37
 
38
- order.reload.update!
38
+ order.reload.update_with_updater!
39
39
  while order.state != order.checkout_steps[-2] && order.next; end
40
40
 
41
41
  unless order.payments.present?
@@ -54,7 +54,7 @@ namespace :exchanges do
54
54
  order.update_attributes!(state: "confirm")
55
55
 
56
56
  order.reload.next!
57
- order.update!
57
+ order.update_with_updater!
58
58
  order.finalize!
59
59
 
60
60
  failed_orders << order unless order.completed? && order.valid?
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <!-- shameless -->
4
+ <head>
5
+ <title>Jason Ronallo</title>
6
+ </head>
7
+
8
+ <body>
9
+ <span itemscope itemtype="http://schema.org/Person"
10
+ itemid="http://ronallo.com#me">
11
+ <a itemprop="url" href="http://twitter.com/ronallo">
12
+ <span itemprop="name">Jason Ronallo</span>
13
+ </a> is the
14
+ <span itemprop="jobTitle">Associate Head of Digital Library Initiatives</span> at
15
+ <span itemprop="affiliation" itemscope itemtype="http://schema.org/Library" itemid="http://lib.ncsu.edu">
16
+ <span itemprop="name">
17
+ <a itemprop="url" href="http://www.lib.ncsu.edu">NCSU Libraries</a>
18
+ </span>
19
+ </span>
20
+ </span>
21
+ </body>
22
+ </html>
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>itemref example from Microdata spec</title>
5
+ </head>
6
+ <body>
7
+ <div itemscope id="amanda" itemref="a b"></div>
8
+ <p id="a">Name: <span itemprop="name">Amanda</span></p>
9
+ <div id="b" itemprop="band" itemscope itemref="c"></div>
10
+ <div id="c">
11
+ <p>Band: <span itemprop="name">Jazz Band</span></p>
12
+ <p>Size: <span itemprop="size">12</span> players</p>
13
+ </div>
14
+ </body>
15
+ </html>
@@ -0,0 +1,20 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <title>Jason Ronallo</title>
5
+ </head>
6
+ <body>
7
+ <span itemtype="http://schema.org/Person"
8
+ itemid="http://ronallo.com#me">
9
+ <a itemprop="url" href="http://twitter.com/ronallo">
10
+ <span itemprop="name">Jason Ronallo</span>
11
+ </a> is the
12
+ <span itemprop="jobTitle">Associate Head of Digital Library Initiatives</span> at
13
+ <span itemprop="affiliation" itemtype="http://schema.org/Library" itemid="http://lib.ncsu.edu">
14
+ <span itemprop="name">
15
+ <a itemprop="url" href="http://www.lib.ncsu.edu">NCSU Libraries</a>
16
+ </span>
17
+ </span>
18
+ </span>
19
+ </body>
20
+ </html>
@@ -103,7 +103,7 @@ describe Spree::BaseHelper, type: :helper do
103
103
  # Because the controller_name method returns "test"
104
104
  # controller_name is used by this method to infer what it is supposed
105
105
  # to be generating meta_data_tags for
106
- text = Faker::Lorem.paragraphs(2).join(" ")
106
+ text = FFaker::Lorem.paragraphs(2).join(" ")
107
107
  @test = Spree::Product.new(:description => text)
108
108
  tags = Nokogiri::HTML.parse(meta_data_tags)
109
109
  content = tags.css("meta[name=description]").first["content"]
@@ -134,4 +134,67 @@ describe Spree::BaseHelper, type: :helper do
134
134
  expect(pretty_time(DateTime.new(2012, 5, 6, 13, 33))).to eq "May 06, 2012 1:33 PM"
135
135
  end
136
136
  end
137
+
138
+ describe "#display_price" do
139
+ let!(:product) { create(:product) }
140
+ let(:current_currency) { "USD" }
141
+ let(:current_price_options) { { tax_zone: current_tax_zone } }
142
+
143
+ context "when there is no current order" do
144
+ let (:current_tax_zone) { nil }
145
+
146
+ it "returns the price including default vat" do
147
+ expect(display_price(product)).to eq("$19.99")
148
+ end
149
+
150
+ context "with a default VAT" do
151
+ let(:current_tax_zone) { create(:zone_with_country, default_tax: true) }
152
+ let!(:tax_rate) do
153
+ create :tax_rate,
154
+ included_in_price: true,
155
+ zone: current_tax_zone,
156
+ tax_category: product.tax_category,
157
+ amount: 0.2
158
+ end
159
+
160
+ it "returns the price adding the VAT" do
161
+ expect(display_price(product)).to eq("$19.99")
162
+ end
163
+ end
164
+ end
165
+
166
+ context "with an order that has a tax zone" do
167
+ let(:current_tax_zone) { create(:zone_with_country) }
168
+ let(:current_order) { Spree::Order.new }
169
+ let(:default_zone) { create(:zone_with_country, default_tax: true) }
170
+
171
+ let!(:default_vat) do
172
+ create :tax_rate,
173
+ included_in_price: true,
174
+ zone: default_zone,
175
+ tax_category: product.tax_category,
176
+ amount: 0.2
177
+ end
178
+
179
+ context "that matches no VAT" do
180
+ it "returns the price excluding VAT" do
181
+ expect(display_price(product)).to eq("$16.66")
182
+ end
183
+ end
184
+
185
+ context "that matches a VAT" do
186
+ let!(:other_vat) do
187
+ create :tax_rate,
188
+ included_in_price: true,
189
+ zone: current_tax_zone,
190
+ tax_category: product.tax_category,
191
+ amount: 0.4
192
+ end
193
+
194
+ it "returns the price adding the VAT" do
195
+ expect(display_price(product)).to eq("$23.32")
196
+ end
197
+ end
198
+ end
199
+ end
137
200
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
5
  module Spree
6
6
  describe ProductsHelper, :type => :helper do
@@ -158,6 +158,10 @@ THIS IS THE BEST PRODUCT EVER!
158
158
  expect(description).to eq(initialDescription)
159
159
  end
160
160
 
161
+ context "renders a product description default description incase description is blank" do
162
+ before { product.description = '' }
163
+ it { expect(product_description(product)).to eq(Spree.t(:product_has_no_description)) }
164
+ end
161
165
  end
162
166
 
163
167
  shared_examples_for "line item descriptions" do
@@ -193,10 +197,14 @@ THIS IS THE BEST PRODUCT EVER!
193
197
  end
194
198
 
195
199
  context '#cache_key_for_products' do
200
+ let(:zone) { Spree::Zone.new }
201
+ let(:price_options) { { tax_zone: zone } }
202
+
196
203
  subject { helper.cache_key_for_products }
197
204
  before(:each) do
198
205
  @products = double('products collection')
199
206
  allow(helper).to receive(:params) { {:page => 10} }
207
+ allow(helper).to receive(:current_price_options) { price_options }
200
208
  end
201
209
 
202
210
  context 'when there is a maximum updated date' do
@@ -206,7 +214,7 @@ THIS IS THE BEST PRODUCT EVER!
206
214
  allow(@products).to receive(:maximum).with(:updated_at) { updated_at }
207
215
  end
208
216
 
209
- it { is_expected.to eq('en/USD/spree/products/all-10-20111213-5') }
217
+ it { is_expected.to eq("en/USD/spree/zones/new/spree/products/all-10-20111213-5") }
210
218
  end
211
219
 
212
220
  context 'when there is no considered maximum updated date' do
@@ -217,7 +225,71 @@ THIS IS THE BEST PRODUCT EVER!
217
225
  allow(Date).to receive(:today) { today }
218
226
  end
219
227
 
220
- it { is_expected.to eq('en/USD/spree/products/all-10-20131211-1234567') }
228
+ it { is_expected.to eq("en/USD/spree/zones/new/spree/products/all-10-20131211-1234567") }
229
+ end
230
+ end
231
+
232
+ context "#cache_key_for_product" do
233
+ let(:product) { Spree::Product.new }
234
+ let(:price_options) { { tax_zone: zone } }
235
+
236
+ subject(:cache_key) { helper.cache_key_for_product(product) }
237
+
238
+ before do
239
+ allow(helper).to receive(:current_price_options) { price_options }
240
+ end
241
+
242
+ context "when there is a current tax zone" do
243
+ let(:zone) { Spree::Zone.new }
244
+
245
+ it "includes the current_tax_zone" do
246
+ is_expected.to eq("en/USD/spree/zones/new/spree/products/new/")
247
+ end
248
+ end
249
+
250
+ context "when there is no current tax zone" do
251
+ let(:zone) { nil }
252
+
253
+ it { is_expected.to eq("en/USD/spree/products/new/") }
254
+ end
255
+
256
+ context "when current_price_options includes nil values" do
257
+ let(:price_options) do
258
+ {
259
+ a: nil,
260
+ b: Spree::Zone.new
261
+ }
262
+ end
263
+
264
+ it "does not include nil values" do
265
+ expect(cache_key).to eq("en/USD/spree/zones/new/spree/products/new/")
266
+ end
267
+ end
268
+
269
+ context "when current_price_options includes values that do not implement cache_key" do
270
+ let(:price_options) do
271
+ {
272
+ a: true,
273
+ b: Spree::Zone.new
274
+ }
275
+ end
276
+
277
+ it "includes string representations of these values" do
278
+ expect(cache_key).to eq("en/USD/true/spree/zones/new/spree/products/new/")
279
+ end
280
+ end
281
+
282
+ context "when keys in the options hash are inserted in non-alphabetical order" do
283
+ let(:price_options) do
284
+ {
285
+ b: Spree::Zone.new,
286
+ a: true
287
+ }
288
+ end
289
+
290
+ it "the values are nevertheless returned in alphabetical order of their keys" do
291
+ expect(cache_key).to eq("en/USD/true/spree/zones/new/spree/products/new/")
292
+ end
221
293
  end
222
294
  end
223
295
  end
@@ -34,11 +34,11 @@ describe "i18n" do
34
34
  it "raise error without any context when using a path" do
35
35
  expect {
36
36
  Spree.normal_t('.legacy_translation')
37
- }.to raise_error
37
+ }.to raise_error(StandardError)
38
38
 
39
39
  expect {
40
40
  Spree.translate('.legacy_translation')
41
- }.to raise_error
41
+ }.to raise_error(StandardError)
42
42
  end
43
43
 
44
44
  it "prepends a string scope" do
@@ -22,8 +22,8 @@ describe Spree::Core::Search::Base do
22
22
  subject { described_class.new(params).retrieve_products }
23
23
 
24
24
  before do
25
- @product1.master.images.create(attachment_file_name: "Test", position: 2)
26
- @product1.master.images.create(attachment_file_name: "Test1", position: 1)
25
+ @product1.master.images << create(:image, position: 2)
26
+ @product1.master.images << create(:image, position: 1)
27
27
  @product1.reload
28
28
  end
29
29
 
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'spree/testing_support/url_helpers'
2
3
 
3
4
  class FakesController < ApplicationController
4
5
  include Spree::Core::ControllerHelpers::Auth
@@ -7,6 +8,7 @@ end
7
8
 
8
9
  describe Spree::Core::ControllerHelpers::Auth, type: :controller do
9
10
  controller(FakesController) {}
11
+ include Spree::TestingSupport::UrlHelpers
10
12
 
11
13
  describe '#current_ability' do
12
14
  it 'returns Spree::Ability instance' do
@@ -77,9 +79,9 @@ describe Spree::Core::ControllerHelpers::Auth, type: :controller do
77
79
  before do
78
80
  allow(controller).to receive_messages(try_spree_current_user: double('User', id: 1, last_incomplete_spree_order: nil))
79
81
  end
80
- it 'redirects unauthorized path' do
82
+ it 'redirects forbidden path' do
81
83
  get :index
82
- expect(response).to redirect_to('/unauthorized')
84
+ expect(response).to redirect_to(spree.forbidden_path)
83
85
  end
84
86
  end
85
87
  context 'when guest user' do
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  class FakesController < ApplicationController
4
+ include Spree::Core::ControllerHelpers::Auth
5
+ include Spree::Core::ControllerHelpers::Order
4
6
  include Spree::Core::ControllerHelpers::Store
5
7
  end
6
8
 
@@ -13,4 +15,58 @@ describe Spree::Core::ControllerHelpers::Store, type: :controller do
13
15
  expect(controller.current_store).to eq store
14
16
  end
15
17
  end
18
+
19
+ describe "#current_price_options" do
20
+ subject(:current_price_options) { controller.current_price_options }
21
+
22
+ context "when there is a default tax zone" do
23
+ let(:default_zone) { Spree::Zone.new }
24
+
25
+ before do
26
+ allow(Spree::Zone).to receive(:default_tax).and_return(default_zone)
27
+ end
28
+
29
+ context "when there is no current order" do
30
+ it "returns the default tax zone" do
31
+ is_expected.to include(tax_zone: default_zone)
32
+ end
33
+ end
34
+
35
+ context "when there is a current order" do
36
+ let(:other_zone) { Spree::Zone.new }
37
+ let(:current_order) { Spree::Order.new }
38
+
39
+ before do
40
+ allow(current_order).to receive(:tax_zone).and_return(other_zone)
41
+ allow(controller).to receive(:current_order).and_return(current_order)
42
+ end
43
+
44
+ it { is_expected.to include(tax_zone: other_zone) }
45
+ end
46
+ end
47
+
48
+ context "when there is no default tax zone" do
49
+ before do
50
+ allow(Spree::Zone).to receive(:default_tax).and_return(nil)
51
+ end
52
+
53
+ context "when there is no current order" do
54
+ it "return nil when asked for the current tax zone" do
55
+ expect(current_price_options[:tax_zone]).to be_nil
56
+ end
57
+ end
58
+
59
+ context "when there is a current order" do
60
+ let(:other_zone) { Spree::Zone.new }
61
+ let(:current_order) { Spree::Order.new }
62
+
63
+ before do
64
+ allow(current_order).to receive(:tax_zone).and_return(other_zone)
65
+ allow(controller).to receive(:current_order).and_return(current_order)
66
+ end
67
+
68
+ it { is_expected.to include(tax_zone: other_zone) }
69
+ end
70
+ end
71
+ end
16
72
  end