solidus_core 1.1.0 → 1.1.1

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 (228) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Rakefile +16 -0
  4. data/script/rails +9 -0
  5. data/solidus_core.gemspec +48 -0
  6. data/spec/fixtures/thinking-cat.jpg +0 -0
  7. data/spec/helpers/base_helper_spec.rb +173 -0
  8. data/spec/helpers/order_helper_spec.rb +12 -0
  9. data/spec/helpers/products_helper_spec.rb +208 -0
  10. data/spec/helpers/taxons_helper_spec.rb +17 -0
  11. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  12. data/spec/lib/i18n_spec.rb +106 -0
  13. data/spec/lib/search/base_spec.rb +86 -0
  14. data/spec/lib/search/variant_spec.rb +112 -0
  15. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +66 -0
  16. data/spec/lib/spree/core/controller_helpers/order_spec.rb +92 -0
  17. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +80 -0
  18. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  19. data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
  20. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  21. data/spec/lib/spree/core/current_store_spec.rb +36 -0
  22. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +24 -0
  23. data/spec/lib/spree/core/importer/order_spec.rb +431 -0
  24. data/spec/lib/spree/core/role_configuration_spec.rb +156 -0
  25. data/spec/lib/spree/core/unreturned_item_charger_spec.rb +130 -0
  26. data/spec/lib/spree/core/validators/email_spec.rb +48 -0
  27. data/spec/lib/spree/localized_number_spec.rb +38 -0
  28. data/spec/lib/spree/migrations_spec.rb +36 -0
  29. data/spec/lib/spree/money_spec.rb +127 -0
  30. data/spec/lib/tasks/exchanges_spec.rb +231 -0
  31. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +115 -0
  32. data/spec/lib/tasks/order_capturing_spec.rb +56 -0
  33. data/spec/mailers/carton_mailer_spec.rb +55 -0
  34. data/spec/mailers/order_mailer_spec.rb +135 -0
  35. data/spec/mailers/reimbursement_mailer_spec.rb +40 -0
  36. data/spec/mailers/test_mailer_spec.rb +15 -0
  37. data/spec/models/spree/ability_spec.rb +276 -0
  38. data/spec/models/spree/address_spec.rb +376 -0
  39. data/spec/models/spree/adjustment_reason_spec.rb +13 -0
  40. data/spec/models/spree/adjustment_spec.rb +169 -0
  41. data/spec/models/spree/app_configuration_spec.rb +24 -0
  42. data/spec/models/spree/asset_spec.rb +24 -0
  43. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  44. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  45. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  46. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  47. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  48. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  49. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +60 -0
  50. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  51. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  52. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  53. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  54. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +30 -0
  55. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +36 -0
  56. data/spec/models/spree/calculator/tiered_percent_spec.rb +47 -0
  57. data/spec/models/spree/calculator_spec.rb +36 -0
  58. data/spec/models/spree/carton_spec.rb +133 -0
  59. data/spec/models/spree/classification_spec.rb +93 -0
  60. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  61. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +25 -0
  62. data/spec/models/spree/concerns/user_address_book_spec.rb +332 -0
  63. data/spec/models/spree/concerns/user_methods_spec.rb +41 -0
  64. data/spec/models/spree/credit_card_spec.rb +341 -0
  65. data/spec/models/spree/customer_return_spec.rb +276 -0
  66. data/spec/models/spree/exchange_spec.rb +79 -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 +104 -0
  70. data/spec/models/spree/inventory_unit_spec.rb +307 -0
  71. data/spec/models/spree/item_adjustments_spec.rb +275 -0
  72. data/spec/models/spree/line_item_spec.rb +199 -0
  73. data/spec/models/spree/option_type_spec.rb +14 -0
  74. data/spec/models/spree/option_value_spec.rb +45 -0
  75. data/spec/models/spree/order/address_spec.rb +50 -0
  76. data/spec/models/spree/order/adjustments_spec.rb +27 -0
  77. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  78. data/spec/models/spree/order/checkout_spec.rb +884 -0
  79. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  80. data/spec/models/spree/order/finalizing_spec.rb +110 -0
  81. data/spec/models/spree/order/payment_spec.rb +243 -0
  82. data/spec/models/spree/order/risk_assessment_spec.rb +68 -0
  83. data/spec/models/spree/order/state_machine_spec.rb +209 -0
  84. data/spec/models/spree/order/tax_spec.rb +84 -0
  85. data/spec/models/spree/order/totals_spec.rb +24 -0
  86. data/spec/models/spree/order/updating_spec.rb +18 -0
  87. data/spec/models/spree/order/validations_spec.rb +15 -0
  88. data/spec/models/spree/order_cancellations_spec.rb +120 -0
  89. data/spec/models/spree/order_capturing_spec.rb +150 -0
  90. data/spec/models/spree/order_contents_spec.rb +307 -0
  91. data/spec/models/spree/order_inventory_spec.rb +228 -0
  92. data/spec/models/spree/order_mutex_spec.rb +85 -0
  93. data/spec/models/spree/order_promotion_spec.rb +31 -0
  94. data/spec/models/spree/order_shipping_spec.rb +241 -0
  95. data/spec/models/spree/order_spec.rb +1482 -0
  96. data/spec/models/spree/order_stock_location_spec.rb +18 -0
  97. data/spec/models/spree/order_updater_spec.rb +283 -0
  98. data/spec/models/spree/payment_method/store_credit_spec.rb +294 -0
  99. data/spec/models/spree/payment_method_spec.rb +147 -0
  100. data/spec/models/spree/payment_spec.rb +1087 -0
  101. data/spec/models/spree/permission_sets/base_spec.rb +12 -0
  102. data/spec/models/spree/permission_sets/configuration_display.rb +82 -0
  103. data/spec/models/spree/permission_sets/configuration_management_spec.rb +50 -0
  104. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +22 -0
  105. data/spec/models/spree/permission_sets/order_display_spec.rb +55 -0
  106. data/spec/models/spree/permission_sets/order_management_spec.rb +42 -0
  107. data/spec/models/spree/permission_sets/product_display_spec.rb +60 -0
  108. data/spec/models/spree/permission_sets/product_management_spec.rb +40 -0
  109. data/spec/models/spree/permission_sets/promotion_display_spec.rb +40 -0
  110. data/spec/models/spree/permission_sets/promotion_management_spec.rb +26 -0
  111. data/spec/models/spree/permission_sets/report_display_spec.rb +24 -0
  112. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +41 -0
  113. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +41 -0
  114. data/spec/models/spree/permission_sets/restricted_stock_transfer_display_spec.rb +50 -0
  115. data/spec/models/spree/permission_sets/restricted_stock_transfer_management_spec.rb +160 -0
  116. data/spec/models/spree/permission_sets/stock_display_spec.rb +24 -0
  117. data/spec/models/spree/permission_sets/stock_management_spec.rb +22 -0
  118. data/spec/models/spree/permission_sets/stock_transfer_display_spec.rb +24 -0
  119. data/spec/models/spree/permission_sets/stock_transfer_management_spec.rb +25 -0
  120. data/spec/models/spree/permission_sets/user_display_spec.rb +38 -0
  121. data/spec/models/spree/permission_sets/user_management_spec.rb +48 -0
  122. data/spec/models/spree/preference_spec.rb +80 -0
  123. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  124. data/spec/models/spree/preferences/preferable_spec.rb +294 -0
  125. data/spec/models/spree/preferences/scoped_store_spec.rb +60 -0
  126. data/spec/models/spree/preferences/static_model_preferences_spec.rb +78 -0
  127. data/spec/models/spree/preferences/statically_configurable_spec.rb +60 -0
  128. data/spec/models/spree/preferences/store_spec.rb +39 -0
  129. data/spec/models/spree/price_spec.rb +42 -0
  130. data/spec/models/spree/product/scopes_spec.rb +116 -0
  131. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  132. data/spec/models/spree/product_filter_spec.rb +26 -0
  133. data/spec/models/spree/product_property_spec.rb +18 -0
  134. data/spec/models/spree/product_spec.rb +504 -0
  135. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +96 -0
  136. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +165 -0
  137. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +115 -0
  138. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +40 -0
  139. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  140. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +69 -0
  141. data/spec/models/spree/promotion/rules/item_total_spec.rb +67 -0
  142. data/spec/models/spree/promotion/rules/nth_order_spec.rb +70 -0
  143. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  144. data/spec/models/spree/promotion/rules/option_value_spec.rb +94 -0
  145. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  146. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  147. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  148. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  149. data/spec/models/spree/promotion_builder_spec.rb +118 -0
  150. data/spec/models/spree/promotion_category_spec.rb +17 -0
  151. data/spec/models/spree/promotion_code/code_builder_spec.rb +79 -0
  152. data/spec/models/spree/promotion_code_spec.rb +187 -0
  153. data/spec/models/spree/promotion_handler/cart_spec.rb +130 -0
  154. data/spec/models/spree/promotion_handler/coupon_spec.rb +335 -0
  155. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +47 -0
  156. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  157. data/spec/models/spree/promotion_rule_spec.rb +28 -0
  158. data/spec/models/spree/promotion_spec.rb +776 -0
  159. data/spec/models/spree/refund_spec.rb +192 -0
  160. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  161. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  162. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  163. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  164. data/spec/models/spree/reimbursement_spec.rb +231 -0
  165. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  166. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  167. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  168. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +107 -0
  169. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +97 -0
  170. data/spec/models/spree/return_authorization_spec.rb +290 -0
  171. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  172. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  173. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +85 -0
  174. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  175. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  176. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  177. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  178. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  179. data/spec/models/spree/return_item_spec.rb +776 -0
  180. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  181. data/spec/models/spree/shipment_spec.rb +753 -0
  182. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  183. data/spec/models/spree/shipping_manifest_spec.rb +94 -0
  184. data/spec/models/spree/shipping_method_spec.rb +88 -0
  185. data/spec/models/spree/shipping_rate_spec.rb +142 -0
  186. data/spec/models/spree/state_spec.rb +14 -0
  187. data/spec/models/spree/stock/availability_validator_spec.rb +83 -0
  188. data/spec/models/spree/stock/coordinator_spec.rb +116 -0
  189. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  190. data/spec/models/spree/stock/estimator_spec.rb +146 -0
  191. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  192. data/spec/models/spree/stock/package_spec.rb +163 -0
  193. data/spec/models/spree/stock/packer_spec.rb +91 -0
  194. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  195. data/spec/models/spree/stock/quantifier_spec.rb +115 -0
  196. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  197. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  198. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +50 -0
  199. data/spec/models/spree/stock/splitter/weight_spec.rb +29 -0
  200. data/spec/models/spree/stock_item_spec.rb +444 -0
  201. data/spec/models/spree/stock_location_spec.rb +279 -0
  202. data/spec/models/spree/stock_movement_spec.rb +56 -0
  203. data/spec/models/spree/stock_transfer_spec.rb +290 -0
  204. data/spec/models/spree/store_credit_category_spec.rb +17 -0
  205. data/spec/models/spree/store_credit_event_spec.rb +314 -0
  206. data/spec/models/spree/store_credit_spec.rb +876 -0
  207. data/spec/models/spree/store_spec.rb +55 -0
  208. data/spec/models/spree/tax_category_spec.rb +27 -0
  209. data/spec/models/spree/tax_rate_spec.rb +378 -0
  210. data/spec/models/spree/taxon_spec.rb +74 -0
  211. data/spec/models/spree/taxonomy_spec.rb +18 -0
  212. data/spec/models/spree/tracker_spec.rb +21 -0
  213. data/spec/models/spree/transfer_item_spec.rb +264 -0
  214. data/spec/models/spree/unit_cancel_spec.rb +149 -0
  215. data/spec/models/spree/user_spec.rb +246 -0
  216. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +23 -0
  217. data/spec/models/spree/variant/scopes_spec.rb +55 -0
  218. data/spec/models/spree/variant_property_rule_condition_spec.rb +15 -0
  219. data/spec/models/spree/variant_property_rule_spec.rb +83 -0
  220. data/spec/models/spree/variant_property_rule_value_spec.rb +18 -0
  221. data/spec/models/spree/variant_spec.rb +601 -0
  222. data/spec/models/spree/zone_spec.rb +305 -0
  223. data/spec/spec_helper.rb +80 -0
  224. data/spec/support/big_decimal.rb +5 -0
  225. data/spec/support/concerns/default_price.rb +34 -0
  226. data/spec/support/dummy_ability.rb +4 -0
  227. data/spec/support/test_gateway.rb +2 -0
  228. metadata +242 -2
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::TaxonsHelper, :type => :helper do
4
+ # Regression test for #4382
5
+ it "#taxon_preview" do
6
+ taxon = create(:taxon)
7
+ child_taxon = create(:taxon, parent: taxon)
8
+ product_1 = create(:product)
9
+ product_2 = create(:product)
10
+ product_3 = create(:product)
11
+ taxon.products << product_1
12
+ taxon.products << product_2
13
+ child_taxon.products << product_3
14
+
15
+ expect(taxon_preview(taxon.reload)).to eql([product_1, product_2, product_3])
16
+ end
17
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::CalculatedAdjustments do
4
+ it "should add has_one :calculator relationship" do
5
+ assert Spree::ShippingMethod.reflect_on_all_associations(:has_one).map(&:name).include?(:calculator)
6
+ end
7
+ end
@@ -0,0 +1,106 @@
1
+ require 'rspec/expectations'
2
+ require 'spree/i18n'
3
+ require 'spree/testing_support/i18n'
4
+
5
+ describe "i18n" do
6
+ before do
7
+ I18n.backend.store_translations(:en,
8
+ {
9
+ :spree => {
10
+ :foo => "bar",
11
+ :bar => {
12
+ :foo => "bar within bar scope",
13
+ :invalid => nil,
14
+ :legacy_translation => "back in the day..."
15
+ },
16
+ :invalid => nil,
17
+ :legacy_translation => "back in the day..."
18
+ }
19
+ })
20
+ end
21
+
22
+ it "translates within the spree scope" do
23
+ expect(Spree.normal_t(:foo)).to eql("bar")
24
+ expect(Spree.translate(:foo)).to eql("bar")
25
+ end
26
+
27
+ it "prepends a string scope" do
28
+ expect(Spree.normal_t(:foo, :scope => "bar")).to eql("bar within bar scope")
29
+ end
30
+
31
+ it "prepends to an array scope" do
32
+ expect(Spree.normal_t(:foo, :scope => ["bar"])).to eql("bar within bar scope")
33
+ end
34
+
35
+ it "returns two translations" do
36
+ expect(Spree.normal_t([:foo, 'bar.foo'])).to eql(["bar", "bar within bar scope"])
37
+ end
38
+
39
+ it "returns reasonable string for missing translations" do
40
+ expect(Spree.t(:missing_entry)).to include("<span")
41
+ end
42
+
43
+ context "missed + unused translations" do
44
+ def key_with_locale(key)
45
+ "#{key} (#{I18n.locale})"
46
+ end
47
+
48
+ before do
49
+ Spree.used_translations = []
50
+ end
51
+
52
+ context "missed translations" do
53
+ def assert_missing_translation(key)
54
+ key = key_with_locale(key)
55
+ message = Spree.missing_translation_messages.detect { |m| m == key }
56
+ expect(message).not_to(be_nil, "expected '#{key}' to be missing, but it wasn't.")
57
+ end
58
+
59
+ it "logs missing translations" do
60
+ Spree.t(:missing, :scope => [:else, :where])
61
+ Spree.check_missing_translations
62
+ assert_missing_translation("else")
63
+ assert_missing_translation("else.where")
64
+ assert_missing_translation("else.where.missing")
65
+ end
66
+
67
+ it "does not log present translations" do
68
+ Spree.t(:foo)
69
+ Spree.check_missing_translations
70
+ expect(Spree.missing_translation_messages).to be_empty
71
+ end
72
+
73
+ it "does not break when asked for multiple translations" do
74
+ Spree.t [:foo, 'bar.foo']
75
+ Spree.check_missing_translations
76
+ expect(Spree.missing_translation_messages).to be_empty
77
+ end
78
+ end
79
+
80
+ context "unused translations" do
81
+ def assert_unused_translation(key)
82
+ key = key_with_locale(key)
83
+ message = Spree.unused_translation_messages.detect { |m| m == key }
84
+ expect(message).not_to(be_nil, "expected '#{key}' to be unused, but it was used.")
85
+ end
86
+
87
+ def assert_used_translation(key)
88
+ key = key_with_locale(key)
89
+ message = Spree.unused_translation_messages.detect { |m| m == key }
90
+ expect(message).to(be_nil, "expected '#{key}' to be used, but it wasn't.")
91
+ end
92
+
93
+ it "logs translations that aren't used" do
94
+ Spree.check_unused_translations
95
+ assert_unused_translation("bar.legacy_translation")
96
+ assert_unused_translation("legacy_translation")
97
+ end
98
+
99
+ it "does not log used translations" do
100
+ Spree.t(:foo)
101
+ Spree.check_unused_translations
102
+ assert_used_translation("foo")
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Core::Search::Base do
4
+
5
+ before do
6
+ include Spree::Core::ProductFilters
7
+ @taxon = create(:taxon, name: "Ruby on Rails")
8
+
9
+ @product1 = create(:product, name: "RoR Mug", price: 9.00)
10
+ @product1.taxons << @taxon
11
+ @product2 = create(:product, name: "RoR Shirt", price: 11.00)
12
+ end
13
+
14
+ it "returns all products by default" do
15
+ params = { :per_page => "" }
16
+ searcher = Spree::Core::Search::Base.new(params)
17
+ expect(searcher.retrieve_products.count).to eq(2)
18
+ end
19
+
20
+ context "when include_images is included in the initalization params" do
21
+ let(:params) { { include_images: true, keyword: @product1.name, taxon: @taxon.id } }
22
+ subject { described_class.new(params).retrieve_products }
23
+
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)
27
+ @product1.reload
28
+ end
29
+
30
+ it "returns images in correct order" do
31
+ expect(subject.first).to eq @product1
32
+ expect(subject.first.images).to eq @product1.master.images
33
+ end
34
+ end
35
+
36
+ it "switches to next page according to the page parameter" do
37
+ @product3 = create(:product, :name => "RoR Pants", :price => 14.00)
38
+
39
+ params = { :per_page => "2" }
40
+ searcher = Spree::Core::Search::Base.new(params)
41
+ expect(searcher.retrieve_products.count).to eq(2)
42
+
43
+ params.merge! :page => "2"
44
+ searcher = Spree::Core::Search::Base.new(params)
45
+ expect(searcher.retrieve_products.count).to eq(1)
46
+ end
47
+
48
+ it "maps search params to named scopes" do
49
+ params = { :per_page => "",
50
+ :search => { "price_range_any" => ["Under $10.00"] }}
51
+ searcher = Spree::Core::Search::Base.new(params)
52
+ expect(searcher.send(:get_base_scope).to_sql).to match /<= 10/
53
+ expect(searcher.retrieve_products.count).to eq(1)
54
+ end
55
+
56
+ it "maps multiple price_range_any filters" do
57
+ params = { :per_page => "",
58
+ :search => { "price_range_any" => ["Under $10.00", "$10.00 - $15.00"] }}
59
+ searcher = Spree::Core::Search::Base.new(params)
60
+ expect(searcher.send(:get_base_scope).to_sql).to match /<= 10/
61
+ expect(searcher.send(:get_base_scope).to_sql).to match /between 10 and 15/i
62
+ expect(searcher.retrieve_products.count).to eq(2)
63
+ end
64
+
65
+ it "uses ransack if scope not found" do
66
+ params = { :per_page => "",
67
+ :search => { "name_not_cont" => "Shirt" }}
68
+ searcher = Spree::Core::Search::Base.new(params)
69
+ expect(searcher.retrieve_products.count).to eq(1)
70
+ end
71
+
72
+ it "accepts a current user" do
73
+ user = double
74
+ searcher = Spree::Core::Search::Base.new({})
75
+ searcher.current_user = user
76
+ expect(searcher.current_user).to eql(user)
77
+ end
78
+
79
+ it "finds products in alternate currencies" do
80
+ price = create(:price, :currency => 'EUR', :variant => @product1.master)
81
+ searcher = Spree::Core::Search::Base.new({})
82
+ searcher.current_currency = 'EUR'
83
+ expect(searcher.retrieve_products).to eq([@product1])
84
+ end
85
+
86
+ end
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Core::Search::Variant do
5
+ def assert_found(query_string, variant)
6
+ expect(described_class.new(query_string).results).to include variant
7
+ end
8
+
9
+ def refute_found(query_string, variant)
10
+ expect(described_class.new(query_string).results).not_to include variant
11
+ end
12
+
13
+ let(:product) { FactoryGirl.create(:product, name: "My Special Product", slug: "my-special-product") }
14
+ let!(:variant) { FactoryGirl.create(:variant, product: product, sku: "abc-123") }
15
+
16
+ context "blank string" do
17
+ it { assert_found(nil, variant) }
18
+ it { assert_found("", variant) }
19
+ end
20
+
21
+ context "by sku" do
22
+ it { assert_found("abc-123", variant) }
23
+ it { assert_found("abc-1", variant) }
24
+ it { assert_found("aBc-12", variant) }
25
+ it { refute_found("bca", variant) }
26
+ end
27
+
28
+ context "by product" do
29
+ it { assert_found("My Special Product", variant) }
30
+ it { assert_found("My Spec", variant) }
31
+ it { assert_found("my spec", variant) }
32
+ it { assert_found("my-special-product", variant) }
33
+ it { assert_found("my-spec", variant) }
34
+ it { assert_found("mY-sPec", variant) }
35
+ it { assert_found("My Product", variant) }
36
+ it { refute_found("My House", variant) }
37
+ it { refute_found("my-product", variant) }
38
+ end
39
+
40
+ context "by product + options" do
41
+ before do
42
+ variant.option_values << create(:option_value, presentation: "Robin's egg", name: "blue")
43
+ variant.option_values << create(:option_value, presentation: 'Slim')
44
+ variant.option_values << create(:option_value, presentation: '30')
45
+ end
46
+ it { assert_found("My Spec blue", variant) }
47
+ it { assert_found("My Spec robin egg Slim", variant) }
48
+ it { assert_found("My Spec 30 slim", variant) }
49
+ it { refute_found("My Spec red slim", variant) }
50
+ it { refute_found("foo product blue slim", variant) }
51
+ end
52
+
53
+ context "custom scope" do
54
+ it "takes into account a passed in scope" do
55
+ variant.stock_items.first.set_count_on_hand(10)
56
+ expect(
57
+ described_class.new(variant.sku, scope: Spree::Variant.in_stock).results
58
+ ).to include variant
59
+
60
+ variant.stock_items.each { |si| si.set_count_on_hand(0) }
61
+ expect(
62
+ described_class.new(variant.sku, scope: Spree::Variant.in_stock).results
63
+ ).not_to include variant
64
+ end
65
+ end
66
+
67
+ context "custom search configuration" do
68
+ context "removing a search query" do
69
+ around do |example|
70
+ search_terms = described_class.search_terms
71
+ described_class.search_terms -= [:sku_cont]
72
+ example.run
73
+ described_class.search_terms = search_terms
74
+ end
75
+
76
+ it { refute_found("abc-123", variant) }
77
+ end
78
+
79
+ context "adding a search query" do
80
+ around do |example|
81
+ search_terms = described_class.search_terms
82
+ described_class.search_terms += [:weight_eq]
83
+ example.run
84
+ described_class.search_terms = search_terms
85
+ end
86
+ before { variant.update_attributes!(weight: 5000) }
87
+
88
+ it { assert_found("5000", variant) }
89
+ end
90
+ end
91
+
92
+ describe '#search_terms' do
93
+ # Only search by SKU if the search word is a number
94
+ class NumericSkuSearcher < Core::Search::Variant
95
+ protected
96
+ def search_terms(word)
97
+ if word =~ /\A\d+\z/
98
+ super
99
+ else
100
+ super - [:sku_cont]
101
+ end
102
+ end
103
+ end
104
+
105
+ let!(:numeric_sku_variant) { FactoryGirl.create(:variant, product: product, sku: "123") }
106
+ let!(:non_numeric_sku_variant) { FactoryGirl.create(:variant, product: product, sku: "abc") }
107
+
108
+ it { expect(NumericSkuSearcher.new('123').results).to include numeric_sku_variant }
109
+ it { expect(NumericSkuSearcher.new('abc').results).not_to include non_numeric_sku_variant }
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ class FakesController < ApplicationController
4
+ include Spree::Core::ControllerHelpers::Auth
5
+ def index; render text: 'index'; end
6
+ end
7
+
8
+ describe Spree::Core::ControllerHelpers::Auth, type: :controller do
9
+ controller(FakesController) {}
10
+
11
+ describe '#current_ability' do
12
+ it 'returns Spree::Ability instance' do
13
+ expect(controller.current_ability.class).to eq Spree::Ability
14
+ end
15
+ end
16
+
17
+ describe '#redirect_back_or_default' do
18
+ controller(FakesController) do
19
+ def index; redirect_back_or_default('/'); end
20
+ end
21
+ it 'redirects to session url' do
22
+ session[:spree_user_return_to] = '/redirect'
23
+ get :index
24
+ expect(response).to redirect_to('/redirect')
25
+ end
26
+ it 'redirects to default page' do
27
+ get :index
28
+ expect(response).to redirect_to('/')
29
+ end
30
+ end
31
+
32
+ describe '#set_guest_token' do
33
+ controller(FakesController) do
34
+ def index
35
+ set_guest_token
36
+ render text: 'index'
37
+ end
38
+ end
39
+ it 'sends cookie header' do
40
+ get :index
41
+ expect(response.cookies['guest_token']).not_to be_nil
42
+ end
43
+ end
44
+
45
+ describe '#store_location' do
46
+ it 'sets session return url' do
47
+ allow(controller).to receive_messages(request: double(fullpath: '/redirect'))
48
+ controller.store_location
49
+ expect(session[:spree_user_return_to]).to eq '/redirect'
50
+ end
51
+ end
52
+
53
+ describe '#try_spree_current_user' do
54
+ it 'calls spree_current_user when define spree_current_user method' do
55
+ expect(controller).to receive(:spree_current_user)
56
+ controller.try_spree_current_user
57
+ end
58
+ it 'calls current_spree_user when define current_spree_user method' do
59
+ expect(controller).to receive(:current_spree_user)
60
+ controller.try_spree_current_user
61
+ end
62
+ it 'returns nil' do
63
+ expect(controller.try_spree_current_user).to eq nil
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ class FakesController < ApplicationController
4
+ include Spree::Core::ControllerHelpers::Order
5
+ end
6
+
7
+ describe Spree::Core::ControllerHelpers::Order, type: :controller do
8
+ controller(FakesController) {}
9
+
10
+ let(:user) { create(:user) }
11
+ let(:order) { create(:order, user: user, store: store) }
12
+ let(:store) { create(:store) }
13
+
14
+ before do
15
+ allow(controller).to receive_messages(current_store: store)
16
+ allow(controller).to receive_messages(try_spree_current_user: user)
17
+ end
18
+
19
+ describe '#simple_current_order' do
20
+ it "returns an empty order" do
21
+ expect(controller.simple_current_order.item_count).to eq 0
22
+ end
23
+ it 'returns Spree::Order instance' do
24
+ allow(controller).to receive_messages(cookies: double(signed: { guest_token: order.guest_token }))
25
+ expect(controller.simple_current_order).to eq order
26
+ end
27
+ end
28
+
29
+ describe '#current_order' do
30
+ context 'create_order_if_necessary option is false' do
31
+ let!(:order) { create :order, user: user, store: store }
32
+ it 'returns current order' do
33
+ expect(controller.current_order).to eq order
34
+ end
35
+ end
36
+ context 'create_order_if_necessary option is true' do
37
+ it 'creates new order' do
38
+ expect {
39
+ controller.current_order(create_order_if_necessary: true)
40
+ }.to change(Spree::Order, :count).to(1)
41
+ end
42
+
43
+ it 'assigns the current_store id' do
44
+ controller.current_order(create_order_if_necessary: true)
45
+ expect(Spree::Order.last.store_id).to eq store.id
46
+ end
47
+ end
48
+ end
49
+
50
+ describe '#associate_user' do
51
+ before { allow(controller).to receive_messages(current_order: order) }
52
+ context "user's email is blank" do
53
+ let(:user) { create(:user, email: '') }
54
+ it 'calls Spree::Order#associate_user! method' do
55
+ expect_any_instance_of(Spree::Order).to receive(:associate_user!)
56
+ controller.associate_user
57
+ end
58
+ end
59
+ context "user isn't blank" do
60
+ it 'does not calls Spree::Order#associate_user! method' do
61
+ expect_any_instance_of(Spree::Order).not_to receive(:associate_user!)
62
+ controller.associate_user
63
+ end
64
+ end
65
+ end
66
+
67
+ describe '#set_current_order' do
68
+ let(:incomplete_order) { create(:order, user: user) }
69
+
70
+ context 'when current order not equal to users incomplete orders' do
71
+ before { allow(controller).to receive_messages(current_order: order, last_incomplete_order: incomplete_order, cookies: double(signed: { guest_token: 'guest_token' })) }
72
+
73
+ it 'calls Spree::Order#merge! method' do
74
+ expect(order).to receive(:merge!).with(incomplete_order, user)
75
+ controller.set_current_order
76
+ end
77
+ end
78
+ end
79
+
80
+ describe '#current_currency' do
81
+ it 'returns current currency' do
82
+ Spree::Config[:currency] = 'USD'
83
+ expect(controller.current_currency).to eq 'USD'
84
+ end
85
+ end
86
+
87
+ describe '#ip_address' do
88
+ it 'returns remote ip' do
89
+ expect(controller.ip_address).to eq request.remote_ip
90
+ end
91
+ end
92
+ end