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,156 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::RoleConfiguration do
4
+ class DummyPermissionSet < Spree::PermissionSets::Base
5
+ def activate!
6
+ can :manage, :things
7
+ end
8
+ end
9
+ class OtherDummyPermissionSet < Spree::PermissionSets::Base; end
10
+
11
+ let(:instance) { described_class.instance }
12
+
13
+ around do |example|
14
+ @original_roles = instance.roles.dup
15
+ instance.roles.clear
16
+ example.run
17
+ instance.roles = @original_roles
18
+ end
19
+
20
+ describe ".configure" do
21
+ it "yields with the instance" do
22
+ expect { |b| described_class.configure(&b) }.to yield_with_args(described_class.instance)
23
+ end
24
+
25
+ it "only yields once" do
26
+ expect { |b| described_class.configure(&b) }.to yield_control.once
27
+ end
28
+ end
29
+
30
+ describe "#assign_permissions" do
31
+ let(:name) { "thing" }
32
+ subject { instance.assign_permissions name, [DummyPermissionSet]}
33
+
34
+ context "when a role for the name exists" do
35
+ before do
36
+ instance.roles.merge!({ name => described_class::Role.new(name, Set.new(existing_roles)) })
37
+ end
38
+
39
+ context "when adding duplicate permission sets" do
40
+ let(:existing_roles) { [DummyPermissionSet] }
41
+
42
+ it "does not add another role" do
43
+ expect{subject}.to_not change{instance.roles.count}
44
+ end
45
+
46
+ it "does not add duplicate permission sets" do
47
+ subject
48
+ role = instance.roles.values.detect { |r| r.name == name }
49
+ expect(role.permission_sets).to match_array([DummyPermissionSet])
50
+ end
51
+ end
52
+
53
+ context "when adding new permission sets to an existing role" do
54
+ let(:existing_roles) { [OtherDummyPermissionSet] }
55
+
56
+ it "does not add another role" do
57
+ expect{subject}.to_not change{instance.roles.count}
58
+ end
59
+
60
+ it "appends the permission set to the existing role" do
61
+ subject
62
+ role = instance.roles.values.detect { |r| r.name == name }
63
+ expect(role.permission_sets).to match_array([OtherDummyPermissionSet, DummyPermissionSet])
64
+ end
65
+ end
66
+ end
67
+
68
+ context "when a role for the name does not yet exist" do
69
+ it "creates a new role" do
70
+ expect{subject}.to change{instance.roles.count}.from(0).to(1)
71
+ end
72
+
73
+ it "sets the roles name accordingly" do
74
+ subject
75
+ expect(instance.roles.values.first.name).to eql(name)
76
+ end
77
+
78
+ it "sets the permission sets accordingly" do
79
+ subject
80
+ expect(instance.roles.values.first.permission_sets).to match_array([DummyPermissionSet])
81
+ end
82
+ end
83
+ end
84
+
85
+ describe "#activate_permissions!" do
86
+ let(:user) { build :user }
87
+ let(:role_name) { "testrole" }
88
+ let(:ability) { DummyAbility.new }
89
+
90
+ before do
91
+ user.spree_roles = user_roles.map do |role|
92
+ Spree::Role.create!(name: role)
93
+ end
94
+ end
95
+
96
+ subject { described_class.instance.activate_permissions! ability, user }
97
+
98
+ context "when the configuration has roles" do
99
+ before do
100
+ instance.roles.merge!({ role_name => described_class::Role.new(role_name, [DummyPermissionSet])})
101
+ end
102
+
103
+ context "default_role" do
104
+ let(:role_name) { 'default' }
105
+
106
+ context "when the user has no roles" do
107
+ let(:user_roles) {[]}
108
+
109
+ it "activates the applicable permissions on the ability" do
110
+ expect{subject}.to change{ability.can? :manage, :things}.
111
+ from(false).
112
+ to(true)
113
+ end
114
+ end
115
+
116
+ context "when the user has a different role" do
117
+ let(:user_roles) {[]}
118
+
119
+ it "activates the applicable permissions on the ability" do
120
+ expect{subject}.to change{ability.can? :manage, :things}.
121
+ from(false).
122
+ to(true)
123
+ end
124
+ end
125
+ end
126
+
127
+ context "when the configuration has applicable roles" do
128
+ let(:user_roles) {[role_name, "someotherrandomrole"]}
129
+
130
+ it "activates the applicable permissions on the ability" do
131
+ expect{subject}.to change{ability.can? :manage, :things}.
132
+ from(false).
133
+ to(true)
134
+ end
135
+ end
136
+
137
+ context "when the configuration does not have applicable roles" do
138
+ let(:user_roles) {["somerandomrole"]}
139
+
140
+ it "doesn't activate non matching roles" do
141
+ subject
142
+ expect(ability.can? :manage, :things).to be false
143
+ end
144
+ end
145
+ end
146
+
147
+ context "when the configuration does not have roles" do
148
+ let(:user_roles) {["somerandomrole"]}
149
+
150
+ it "doesnt activate any new permissions" do
151
+ subject
152
+ expect(ability.can? :manage, :things).to be false
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,130 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::UnreturnedItemCharger do
4
+ let(:shipped_order) { create(:shipped_order, line_items_count: 1, with_cartons: false) }
5
+ let(:original_shipment) { shipped_order.shipments.first }
6
+ let(:original_stock_location) { original_shipment.stock_location }
7
+ let(:original_inventory_unit) { shipped_order.inventory_units.first }
8
+ let(:original_variant) { original_inventory_unit.variant }
9
+ let(:exchange_shipment) do
10
+ create(:shipment,
11
+ order: shipped_order,
12
+ state: 'shipped',
13
+ stock_location: original_stock_location,
14
+ created_at: 5.days.ago)
15
+ end
16
+ let(:exchange_inventory_unit) { exchange_shipment.inventory_units.first }
17
+ let(:return_item) do
18
+ create(:exchange_return_item,
19
+ inventory_unit: original_inventory_unit,
20
+ exchange_inventory_unit: exchange_inventory_unit)
21
+ end
22
+
23
+ let!(:unreturned_item_charger) { Spree::UnreturnedItemCharger.new(exchange_shipment, [return_item]) }
24
+
25
+ before do
26
+ exchange_shipment.finalize!
27
+ exchange_inventory_unit.ship!
28
+ end
29
+
30
+ shared_examples 'charge_for_items success' do
31
+ let(:new_order) do
32
+ subject
33
+ exchange_inventory_unit.shipment.order.reload
34
+ end
35
+
36
+ it "reuses the same inventory unit" do
37
+ expect { subject }.not_to change { Spree::InventoryUnit.count }
38
+ end
39
+
40
+ it "reuses the same shipment" do
41
+ expect { subject }.not_to change { Spree::Shipment.count }
42
+ expect(new_order.shipments.count).to eq 1
43
+ end
44
+
45
+ context 'in tax zone' do
46
+ let!(:tax_zone) { Spree::Zone.global }
47
+ let!(:tax_rate) { create(:tax_rate, zone: tax_zone, tax_category: original_variant.tax_category) }
48
+ before { tax_zone.update_attributes!(default_tax: true) }
49
+
50
+ it "applies tax" do
51
+ exchange_shipment.shipping_rates.update_all(tax_rate_id: tax_rate.id)
52
+ exchange_order = exchange_shipment.order
53
+ exchange_order.create_tax_charge!
54
+ exchange_order.update!
55
+ subject
56
+ expect(new_order.additional_tax_total).to be > 0
57
+ expect(new_order.line_items[0].additional_tax_total).to be > 0
58
+ expect(new_order.shipments[0].additional_tax_total).to be > 0
59
+ end
60
+ end
61
+
62
+ it "updates shipment cost" do
63
+ exchange_shipment.update_attributes!(cost: 0)
64
+ expect { subject }.to change { exchange_shipment.reload.cost }
65
+ end
66
+
67
+ it "creates a new completed order" do
68
+ expect { subject }.to change { Spree::Order.count }.by(1)
69
+ expect(new_order).to_not eq(shipped_order)
70
+ expect(new_order).to be_completed
71
+ end
72
+
73
+ it "authorizes payment" do
74
+ expect { subject }.to change { Spree::Payment.count }.by(1)
75
+ expect(new_order.payments.count).to eq 1
76
+ expect(new_order.payments.first).to be_pending
77
+ expect(new_order.payments.first.response_code).to be_present
78
+ end
79
+
80
+ it "delivers confirmation email" do
81
+ expect { subject }.to change { ActionMailer::Base.deliveries.count }.by(1)
82
+ end
83
+
84
+ context 'with auto_capture_exchanges' do
85
+ before { Spree::Config[:auto_capture_exchanges] = true }
86
+
87
+ it "captures payment" do
88
+ expect { subject }.to change { Spree::Payment.count }.by(1)
89
+ expect(new_order.payments.count).to eq 1
90
+ expect(new_order.payments.first).to be_completed
91
+ expect(new_order.payment_state).to eq "paid"
92
+ end
93
+ end
94
+ end
95
+
96
+ describe "#charge_for_items" do
97
+ before do
98
+ original_variant.update_attributes!(track_inventory: true)
99
+ original_variant.stock_items.update_all(backorderable: false)
100
+ end
101
+
102
+ subject { unreturned_item_charger.charge_for_items }
103
+
104
+ context "new order is not an unreturned exchange" do
105
+ before do
106
+ allow_any_instance_of(Spree::Shipment).to receive(:update_attributes!)
107
+ end
108
+
109
+ it "raises an error" do
110
+ expect { subject }.to raise_error(Spree::UnreturnedItemCharger::ChargeFailure, 'order is not an unreturned exchange')
111
+ end
112
+ end
113
+
114
+ context "item is in stock" do
115
+ before do
116
+ original_variant.stock_items.map { |si| si.set_count_on_hand(10) }
117
+ end
118
+
119
+ include_examples 'charge_for_items success'
120
+ end
121
+
122
+ context "item is now out of stock" do
123
+ before do
124
+ original_variant.stock_items.map { |si| si.set_count_on_hand(0) }
125
+ end
126
+
127
+ include_examples 'charge_for_items success'
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe EmailValidator do
4
+
5
+ class Tester
6
+ include ActiveModel::Validations
7
+ attr_accessor :email_address
8
+ validates :email_address, email: true
9
+ end
10
+
11
+ let(:valid_emails) {[
12
+ 'valid@email.com',
13
+ 'valid@email.com.uk',
14
+ 'e@email.com',
15
+ 'valid+email@email.com',
16
+ 'valid-email@email.com',
17
+ 'valid_email@email.com',
18
+ 'valid.email@email.com'
19
+ ]}
20
+ let(:invalid_emails) {[
21
+ 'invalid email@email.com',
22
+ '.invalid.email@email.com',
23
+ 'invalid.email.@email.com',
24
+ '@email.com',
25
+ '.@email.com',
26
+ 'invalidemailemail.com',
27
+ '@invalid.email@email.com',
28
+ 'invalid@email@email.com',
29
+ 'invalid.email@@email.com'
30
+ ]}
31
+
32
+ it 'validates valid email addresses' do
33
+ tester = Tester.new
34
+ valid_emails.each do |email|
35
+ tester.email_address = email
36
+ expect(tester.valid?).to be true
37
+ end
38
+ end
39
+
40
+ it 'validates invalid email addresses' do
41
+ tester = Tester.new
42
+ invalid_emails.each do |email|
43
+ tester.email_address = email
44
+ expect(tester.valid?).to be false
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::LocalizedNumber do
4
+
5
+ context ".parse" do
6
+ before do
7
+ I18n.enforce_available_locales = false
8
+ I18n.locale = I18n.default_locale
9
+ I18n.backend.store_translations(:de, { :number => { :currency => { :format => { :delimiter => '.', :separator => ',' } } } })
10
+ end
11
+
12
+ after do
13
+ I18n.locale = I18n.default_locale
14
+ I18n.enforce_available_locales = true
15
+ end
16
+
17
+ context "with decimal point" do
18
+ it "captures the proper amount for a formatted price" do
19
+ expect(subject.class.parse('1,599.99')).to eql 1599.99
20
+ end
21
+ end
22
+
23
+ context "with decimal comma" do
24
+ it "captures the proper amount for a formatted price" do
25
+ I18n.locale = :de
26
+ expect(subject.class.parse('1.599,99')).to eql 1599.99
27
+ end
28
+ end
29
+
30
+ context "with a numeric price" do
31
+ it "uses the price as is" do
32
+ I18n.locale = :de
33
+ expect(subject.class.parse(1599.99)).to eql 1599.99
34
+ end
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Migrations do
5
+ let(:app_migrations) { [".", "34_add_title.rb", "52_add_text.rb"] }
6
+ let(:engine_migrations) { [".", "334_create_orders.spree.rb", "777_create_products.spree.rb"] }
7
+
8
+ let(:config) { double("Config", root: "dir") }
9
+
10
+ let(:engine_dir) { "dir/db/migrate" }
11
+ let(:app_dir) { "#{Rails.root}/db/migrate" }
12
+
13
+ subject { described_class.new(config, "spree") }
14
+
15
+ before do
16
+ expect(File).to receive(:directory?).with(app_dir).and_return true
17
+ end
18
+
19
+ it "warns about missing migrations" do
20
+ expect(Dir).to receive(:entries).with(app_dir).and_return app_migrations
21
+ expect(Dir).to receive(:entries).with(engine_dir).and_return engine_migrations
22
+
23
+ silence_stream(STDOUT) {
24
+ expect(subject.check).to eq true
25
+ }
26
+ end
27
+
28
+ context "no missing migrations" do
29
+ it "says nothing" do
30
+ expect(Dir).to receive(:entries).with(engine_dir).and_return engine_migrations
31
+ expect(Dir).to receive(:entries).with(app_dir).and_return (app_migrations + engine_migrations)
32
+ expect(subject.check).to eq nil
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,127 @@
1
+ # coding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Spree::Money do
5
+ before do
6
+ configure_spree_preferences do |config|
7
+ config.currency = "USD"
8
+ end
9
+ end
10
+
11
+ it "formats correctly" do
12
+ money = Spree::Money.new(10)
13
+ expect(money.to_s).to eq("$10.00")
14
+ end
15
+
16
+ it "can get cents" do
17
+ money = Spree::Money.new(10)
18
+ expect(money.cents).to eq(1000)
19
+ end
20
+
21
+ context "with currency" do
22
+ it "passed in option" do
23
+ money = Spree::Money.new(10, :with_currency => true, :html => false)
24
+ expect(money.to_s).to eq("$10.00 USD")
25
+ end
26
+ end
27
+
28
+ context "hide cents" do
29
+ it "hides cents suffix" do
30
+ money = Spree::Money.new(10, no_cents: true)
31
+ expect(money.to_s).to eq("$10")
32
+ end
33
+
34
+ it "shows cents suffix" do
35
+ money = Spree::Money.new(10)
36
+ expect(money.to_s).to eq("$10.00")
37
+ end
38
+ end
39
+
40
+ context "currency parameter" do
41
+ context "when currency is specified in Canadian Dollars" do
42
+ it "uses the currency param over the global configuration" do
43
+ money = Spree::Money.new(10, :currency => 'CAD', :with_currency => true, :html => false)
44
+ expect(money.to_s).to eq("$10.00 CAD")
45
+ end
46
+ end
47
+
48
+ context "when currency is specified in Japanese Yen" do
49
+ it "uses the currency param over the global configuration" do
50
+ money = Spree::Money.new(100, :currency => 'JPY', :html => false)
51
+ expect(money.to_s).to eq("¥100")
52
+ end
53
+ end
54
+ end
55
+
56
+ context "symbol positioning" do
57
+ it "passed in option" do
58
+ money = Spree::Money.new(10, :symbol_position => :after, :html => false)
59
+ expect(money.to_s).to eq("10.00 $")
60
+ end
61
+
62
+ it "config option" do
63
+ money = Spree::Money.new(10, symbol_position: :after, html: false)
64
+ expect(money.to_s).to eq("10.00 $")
65
+ end
66
+ end
67
+
68
+ context "sign before symbol" do
69
+ it "defaults to -$10.00" do
70
+ money = Spree::Money.new(-10)
71
+ expect(money.to_s).to eq("-$10.00")
72
+ end
73
+
74
+ it "passed in option" do
75
+ money = Spree::Money.new(-10, :sign_before_symbol => false)
76
+ expect(money.to_s).to eq("$-10.00")
77
+ end
78
+ end
79
+
80
+ context "JPY" do
81
+ before do
82
+ configure_spree_preferences do |config|
83
+ config.currency = "JPY"
84
+ end
85
+ end
86
+
87
+ it "formats correctly" do
88
+ money = Spree::Money.new(1000, :html => false)
89
+ expect(money.to_s).to eq("¥1,000")
90
+ end
91
+ end
92
+
93
+ context "EUR" do
94
+ before do
95
+ configure_spree_preferences do |config|
96
+ config.currency = "EUR"
97
+ end
98
+ end
99
+
100
+ # Regression test for #2634
101
+ it "formats as plain by default" do
102
+ money = Spree::Money.new(10, symbol_position: :after)
103
+ expect(money.to_s).to eq("10.00 €")
104
+ end
105
+
106
+ it "formats as HTML if asked (nicely) to" do
107
+ money = Spree::Money.new(10, symbol_position: :after)
108
+ # The HTML'ified version of "10.00 €"
109
+ expect(money.to_html).to eq("10.00&nbsp;&#x20AC;")
110
+ end
111
+
112
+ it "formats as HTML with currency" do
113
+ money = Spree::Money.new(10, symbol_position: :after, with_currency: true)
114
+ # The HTML'ified version of "10.00 €"
115
+ expect(money.to_html).to eq("10.00&nbsp;&#x20AC; <span class=\"currency\">EUR</span>")
116
+ end
117
+ end
118
+
119
+ describe "#as_json" do
120
+ let(:options) { double('options') }
121
+
122
+ it "returns the expected string" do
123
+ money = Spree::Money.new(10)
124
+ expect(money.as_json(options)).to eq("$10.00")
125
+ end
126
+ end
127
+ end