solidus_core 1.0.2 → 1.0.3

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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -0
  3. data/Gemfile +3 -0
  4. data/Rakefile +16 -0
  5. data/script/rails +9 -0
  6. data/solidus_core.gemspec +48 -0
  7. data/spec/fixtures/thinking-cat.jpg +0 -0
  8. data/spec/helpers/base_helper_spec.rb +173 -0
  9. data/spec/helpers/order_helper_spec.rb +12 -0
  10. data/spec/helpers/products_helper_spec.rb +220 -0
  11. data/spec/helpers/taxons_helper_spec.rb +17 -0
  12. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  13. data/spec/lib/i18n_spec.rb +123 -0
  14. data/spec/lib/search/base_spec.rb +86 -0
  15. data/spec/lib/search/variant_spec.rb +92 -0
  16. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +66 -0
  17. data/spec/lib/spree/core/controller_helpers/order_spec.rb +92 -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 +22 -0
  23. data/spec/lib/spree/core/importer/order_spec.rb +431 -0
  24. data/spec/lib/spree/core/role_configuration_spec.rb +138 -0
  25. data/spec/lib/spree/core/validators/email_spec.rb +48 -0
  26. data/spec/lib/spree/localized_number_spec.rb +38 -0
  27. data/spec/lib/spree/migrations_spec.rb +36 -0
  28. data/spec/lib/spree/money_spec.rb +127 -0
  29. data/spec/lib/tasks/exchanges_spec.rb +231 -0
  30. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +115 -0
  31. data/spec/lib/tasks/order_capturing_spec.rb +56 -0
  32. data/spec/mailers/carton_mailer_spec.rb +43 -0
  33. data/spec/mailers/order_mailer_spec.rb +122 -0
  34. data/spec/mailers/reimbursement_mailer_spec.rb +40 -0
  35. data/spec/mailers/test_mailer_spec.rb +15 -0
  36. data/spec/models/spree/ability_spec.rb +276 -0
  37. data/spec/models/spree/address_spec.rb +250 -0
  38. data/spec/models/spree/adjustment_reason_spec.rb +13 -0
  39. data/spec/models/spree/adjustment_spec.rb +177 -0
  40. data/spec/models/spree/app_configuration_spec.rb +20 -0
  41. data/spec/models/spree/asset_spec.rb +24 -0
  42. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  43. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  44. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  45. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  46. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  47. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  48. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +51 -0
  49. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  50. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  51. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  52. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  53. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +30 -0
  54. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +36 -0
  55. data/spec/models/spree/calculator/tiered_percent_spec.rb +47 -0
  56. data/spec/models/spree/calculator_spec.rb +36 -0
  57. data/spec/models/spree/carton_spec.rb +133 -0
  58. data/spec/models/spree/classification_spec.rb +15 -0
  59. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  60. data/spec/models/spree/concerns/user_methods_spec.rb +41 -0
  61. data/spec/models/spree/credit_card_spec.rb +334 -0
  62. data/spec/models/spree/customer_return_spec.rb +276 -0
  63. data/spec/models/spree/exchange_spec.rb +79 -0
  64. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  65. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  66. data/spec/models/spree/gateway_spec.rb +82 -0
  67. data/spec/models/spree/inventory_unit_spec.rb +307 -0
  68. data/spec/models/spree/item_adjustments_spec.rb +256 -0
  69. data/spec/models/spree/line_item_spec.rb +191 -0
  70. data/spec/models/spree/option_type_spec.rb +14 -0
  71. data/spec/models/spree/option_value_spec.rb +22 -0
  72. data/spec/models/spree/order/address_spec.rb +50 -0
  73. data/spec/models/spree/order/adjustments_spec.rb +39 -0
  74. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  75. data/spec/models/spree/order/checkout_spec.rb +902 -0
  76. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  77. data/spec/models/spree/order/finalizing_spec.rb +111 -0
  78. data/spec/models/spree/order/payment_spec.rb +210 -0
  79. data/spec/models/spree/order/risk_assessment_spec.rb +68 -0
  80. data/spec/models/spree/order/state_machine_spec.rb +221 -0
  81. data/spec/models/spree/order/tax_spec.rb +84 -0
  82. data/spec/models/spree/order/totals_spec.rb +24 -0
  83. data/spec/models/spree/order/updating_spec.rb +18 -0
  84. data/spec/models/spree/order/validations_spec.rb +15 -0
  85. data/spec/models/spree/order_cancellations_spec.rb +120 -0
  86. data/spec/models/spree/order_capturing_spec.rb +116 -0
  87. data/spec/models/spree/order_contents_spec.rb +265 -0
  88. data/spec/models/spree/order_inventory_spec.rb +228 -0
  89. data/spec/models/spree/order_mutex_spec.rb +85 -0
  90. data/spec/models/spree/order_promotion_spec.rb +31 -0
  91. data/spec/models/spree/order_shipping_spec.rb +247 -0
  92. data/spec/models/spree/order_spec.rb +1412 -0
  93. data/spec/models/spree/order_stock_location_spec.rb +18 -0
  94. data/spec/models/spree/order_updater_spec.rb +299 -0
  95. data/spec/models/spree/payment_method/store_credit_spec.rb +294 -0
  96. data/spec/models/spree/payment_method_spec.rb +96 -0
  97. data/spec/models/spree/payment_spec.rb +1044 -0
  98. data/spec/models/spree/permission_sets/base_spec.rb +12 -0
  99. data/spec/models/spree/permission_sets/configuration_display.rb +82 -0
  100. data/spec/models/spree/permission_sets/configuration_management_spec.rb +50 -0
  101. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +22 -0
  102. data/spec/models/spree/permission_sets/order_display_spec.rb +49 -0
  103. data/spec/models/spree/permission_sets/order_management_spec.rb +36 -0
  104. data/spec/models/spree/permission_sets/product_display_spec.rb +60 -0
  105. data/spec/models/spree/permission_sets/product_management_spec.rb +40 -0
  106. data/spec/models/spree/permission_sets/promotion_display_spec.rb +34 -0
  107. data/spec/models/spree/permission_sets/promotion_management_spec.rb +26 -0
  108. data/spec/models/spree/permission_sets/report_display_spec.rb +24 -0
  109. data/spec/models/spree/permission_sets/restricted_transfer_management_spec.rb +132 -0
  110. data/spec/models/spree/permission_sets/stock_display_spec.rb +26 -0
  111. data/spec/models/spree/permission_sets/stock_management_spec.rb +24 -0
  112. data/spec/models/spree/permission_sets/user_display_spec.rb +36 -0
  113. data/spec/models/spree/permission_sets/user_management_spec.rb +28 -0
  114. data/spec/models/spree/preference_spec.rb +80 -0
  115. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  116. data/spec/models/spree/preferences/preferable_spec.rb +294 -0
  117. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  118. data/spec/models/spree/preferences/static_model_preferences_spec.rb +78 -0
  119. data/spec/models/spree/preferences/statically_configurable_spec.rb +60 -0
  120. data/spec/models/spree/preferences/store_spec.rb +39 -0
  121. data/spec/models/spree/price_spec.rb +42 -0
  122. data/spec/models/spree/product/scopes_spec.rb +148 -0
  123. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  124. data/spec/models/spree/product_filter_spec.rb +26 -0
  125. data/spec/models/spree/product_property_spec.rb +20 -0
  126. data/spec/models/spree/product_spec.rb +437 -0
  127. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +96 -0
  128. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +165 -0
  129. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +115 -0
  130. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +40 -0
  131. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  132. data/spec/models/spree/promotion/rules/item_total_spec.rb +67 -0
  133. data/spec/models/spree/promotion/rules/nth_order_spec.rb +70 -0
  134. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  135. data/spec/models/spree/promotion/rules/option_value_spec.rb +94 -0
  136. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  137. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  138. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  139. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  140. data/spec/models/spree/promotion_builder_spec.rb +118 -0
  141. data/spec/models/spree/promotion_category_spec.rb +17 -0
  142. data/spec/models/spree/promotion_code/code_builder_spec.rb +79 -0
  143. data/spec/models/spree/promotion_code_spec.rb +187 -0
  144. data/spec/models/spree/promotion_handler/cart_spec.rb +114 -0
  145. data/spec/models/spree/promotion_handler/coupon_spec.rb +335 -0
  146. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +47 -0
  147. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  148. data/spec/models/spree/promotion_rule_spec.rb +28 -0
  149. data/spec/models/spree/promotion_spec.rb +767 -0
  150. data/spec/models/spree/refund_spec.rb +204 -0
  151. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  152. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  153. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  154. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  155. data/spec/models/spree/reimbursement_spec.rb +231 -0
  156. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  157. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  158. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  159. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +107 -0
  160. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +97 -0
  161. data/spec/models/spree/return_authorization_spec.rb +290 -0
  162. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  163. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  164. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +85 -0
  165. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  166. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  167. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  168. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  169. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  170. data/spec/models/spree/return_item_spec.rb +775 -0
  171. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  172. data/spec/models/spree/shipment_spec.rb +709 -0
  173. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  174. data/spec/models/spree/shipping_method_spec.rb +88 -0
  175. data/spec/models/spree/shipping_rate_spec.rb +142 -0
  176. data/spec/models/spree/state_spec.rb +14 -0
  177. data/spec/models/spree/stock/availability_validator_spec.rb +83 -0
  178. data/spec/models/spree/stock/coordinator_spec.rb +116 -0
  179. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  180. data/spec/models/spree/stock/estimator_spec.rb +146 -0
  181. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  182. data/spec/models/spree/stock/package_spec.rb +163 -0
  183. data/spec/models/spree/stock/packer_spec.rb +91 -0
  184. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  185. data/spec/models/spree/stock/quantifier_spec.rb +115 -0
  186. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  187. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  188. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +50 -0
  189. data/spec/models/spree/stock/splitter/weight_spec.rb +29 -0
  190. data/spec/models/spree/stock_item_spec.rb +426 -0
  191. data/spec/models/spree/stock_location_spec.rb +279 -0
  192. data/spec/models/spree/stock_movement_spec.rb +56 -0
  193. data/spec/models/spree/stock_transfer_spec.rb +290 -0
  194. data/spec/models/spree/store_credit_category_spec.rb +17 -0
  195. data/spec/models/spree/store_credit_event_spec.rb +314 -0
  196. data/spec/models/spree/store_credit_spec.rb +876 -0
  197. data/spec/models/spree/store_spec.rb +55 -0
  198. data/spec/models/spree/tax_category_spec.rb +27 -0
  199. data/spec/models/spree/tax_rate_spec.rb +378 -0
  200. data/spec/models/spree/taxon_spec.rb +74 -0
  201. data/spec/models/spree/taxonomy_spec.rb +18 -0
  202. data/spec/models/spree/tracker_spec.rb +21 -0
  203. data/spec/models/spree/transfer_item_spec.rb +264 -0
  204. data/spec/models/spree/unit_cancel_spec.rb +148 -0
  205. data/spec/models/spree/user_spec.rb +223 -0
  206. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +23 -0
  207. data/spec/models/spree/variant/scopes_spec.rb +55 -0
  208. data/spec/models/spree/variant_spec.rb +546 -0
  209. data/spec/models/spree/zone_spec.rb +305 -0
  210. data/spec/spec_helper.rb +78 -0
  211. data/spec/support/big_decimal.rb +5 -0
  212. data/spec/support/concerns/default_price.rb +34 -0
  213. data/spec/support/dummy_ability.rb +4 -0
  214. data/spec/support/test_gateway.rb +2 -0
  215. metadata +229 -3
  216. data/lib/spree/testing_support/rspec-activemodel-mocks_patch.rb +0 -8
@@ -0,0 +1,115 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'spree:migrations:copy_shipped_shipments_to_cartons' do
4
+ before do
5
+ Rails.application.load_tasks
6
+ task.reenable
7
+ end
8
+
9
+ describe 'up' do
10
+ let(:task) do
11
+ Rake::Task['spree:migrations:copy_shipped_shipments_to_cartons:up']
12
+ end
13
+
14
+ # should generate a carton
15
+ let!(:shipped_shipment) { shipped_order.shipments.first }
16
+ # should not generate a carton because it's not shipped
17
+ let!(:unshipped_shipment) { create(:shipment) }
18
+ # should not generate a carton because it has no inventory units
19
+ let!(:shipped_shipment_without_units) do
20
+ shipped_order_without_units.shipments.first
21
+ end
22
+ # should not generate a carton because it already has a carton
23
+ let!(:shipped_and_cartonized_shipment) do
24
+ shipped_and_cartonized_order.shipments.first
25
+ end
26
+
27
+ let(:shipped_order) { create(:shipped_order, line_items_count: 1, with_cartons: false) }
28
+
29
+ let(:shipped_order_without_units) do
30
+ create(:shipped_order, line_items_count: 1) do |order|
31
+ order.inventory_units.delete_all
32
+ end
33
+ end
34
+
35
+ let(:shipped_and_cartonized_order) do
36
+ create(:order_ready_to_ship, line_items_count: 1).tap do |order|
37
+ order.shipping.ship_shipment(order.shipments.first)
38
+ end
39
+ end
40
+
41
+ it 'creates the expected carton' do
42
+ expect {
43
+ task.invoke
44
+ }.to change { Spree::Carton.count }.by(1)
45
+
46
+ carton = Spree::Carton.last
47
+
48
+ expect(carton).to be_valid
49
+
50
+ expect(carton.imported_from_shipment_id).to eq shipped_shipment.id
51
+ expect(carton.orders).to eq [shipped_order]
52
+
53
+ expect(carton.number).to eq "C#{shipped_shipment.number}"
54
+ expect(carton.stock_location).to eq shipped_shipment.stock_location
55
+ expect(carton.address).to eq shipped_shipment.address
56
+ expect(carton.shipping_method).to eq shipped_shipment.shipping_method
57
+ expect(carton.tracking).to eq shipped_shipment.tracking
58
+ expect(carton.shipped_at).to eq shipped_shipment.shipped_at
59
+ expect(carton.created_at).to be_present
60
+ expect(carton.updated_at).to be_present
61
+
62
+ expect(carton.inventory_units).to match_array shipped_shipment.inventory_units
63
+ end
64
+
65
+ describe 'when run a second time' do
66
+ before do
67
+ task.invoke
68
+ task.reenable
69
+ end
70
+
71
+ let!(:second_shipped_shipment) { second_shipped_order.shipments.first }
72
+
73
+ let(:second_shipped_order) { create(:shipped_order, line_items_count: 1, with_cartons: false) }
74
+
75
+ it 'creates only a carton for the second shipment' do
76
+ expect {
77
+ task.invoke
78
+ }.to change { Spree::Carton.count }.by(1)
79
+
80
+ carton = Spree::Carton.last
81
+
82
+ expect(carton.imported_from_shipment_id).to eq second_shipped_shipment.id
83
+ expect(carton.orders).to eq [second_shipped_order]
84
+ end
85
+ end
86
+ end
87
+
88
+ describe 'down' do
89
+ let(:task) do
90
+ Rake::Task['spree:migrations:copy_shipped_shipments_to_cartons:down']
91
+ end
92
+
93
+ let!(:migrated_carton) { create(:carton) }
94
+ let!(:preexisting_carton) { create(:carton) }
95
+
96
+ let!(:migrated_carton_inventory_units) { migrated_carton.inventory_units.to_a }
97
+ let!(:preexisting_carton_inventory_units) { preexisting_carton.inventory_units.to_a }
98
+
99
+ before do
100
+ migrated_carton.update!(imported_from_shipment_id: migrated_carton.inventory_units.first.shipment_id)
101
+ end
102
+
103
+ it 'clears out the correct carton' do
104
+ expect {
105
+ task.invoke
106
+ }.to change { Spree::Carton.count }.by(-1)
107
+
108
+ expect(Spree::Carton.find_by(id: migrated_carton.id)).to be_nil
109
+
110
+ expect(migrated_carton_inventory_units.map(&:reload).map(&:carton_id)).to all(be_nil)
111
+ expect(preexisting_carton_inventory_units.map(&:reload).map(&:carton_id)).to all(eq preexisting_carton.id)
112
+ end
113
+ end
114
+
115
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe "order_capturing:capture_payments" do
4
+ let(:task) do
5
+ Rake::Task['order_capturing:capture_payments']
6
+ end
7
+
8
+ before do
9
+ Rails.application.load_tasks
10
+ task.reenable
11
+ end
12
+
13
+ subject { task }
14
+
15
+ describe '#prerequisites' do
16
+ subject { super().prerequisites }
17
+ it { is_expected.to include("environment") }
18
+ end
19
+ let(:order) { create(:completed_order_with_pending_payment, line_items_count: 2) }
20
+ let(:payment) { order.payments.first }
21
+
22
+ context "with a mix of canceled and shipped inventory" do
23
+ before do
24
+ Spree::OrderCancellations.new(order).short_ship([order.inventory_units.first])
25
+ order.shipping.ship_shipment(order.shipments.first)
26
+ order.update_attributes!(payment_state: 'balance_due')
27
+ end
28
+
29
+ it "charges the order" do
30
+ expect(order.inventory_units.any?(&:on_hand?)).to eq false
31
+ expect(order.inventory_units.all? {|iu| iu.canceled? || iu.shipped? }).to eq true
32
+ expect {
33
+ expect { subject.invoke }.to change { payment.reload.state }.to('completed')
34
+ }.to change { order.reload.payment_state }.to('paid')
35
+ end
36
+
37
+ context "when there is an error capturing payment" do
38
+ before do
39
+ allow_any_instance_of(Spree::OrderCapturing).to receive(:capture_payments).and_raise(StateMachines::InvalidTransition)
40
+ end
41
+
42
+ it "raises a OrderCapturingFailures" do
43
+ expect { subject.invoke }.to raise_error(Spree::OrderCapturingFailures)
44
+ end
45
+ end
46
+ end
47
+
48
+ context "with any inventory not shipped or canceled" do
49
+ it "does not charge for the order" do
50
+ expect(order.inventory_units.any?(&:on_hand?)).to eq true
51
+ expect {
52
+ expect { subject.invoke }.not_to change { payment.reload }
53
+ }.not_to change { order.reload.payment_state }
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+ require 'email_spec'
3
+
4
+ describe Spree::CartonMailer do
5
+ include EmailSpec::Helpers
6
+ include EmailSpec::Matchers
7
+
8
+ let(:carton) { create(:carton) }
9
+
10
+ # Regression test for #2196
11
+ it "doesn't include out of stock in the email body" do
12
+ shipment_email = Spree::CartonMailer.shipped_email(carton.id)
13
+ expect(shipment_email.body).not_to include(%Q{Out of Stock})
14
+ end
15
+
16
+ context "with resend option" do
17
+ subject do
18
+ Spree::CartonMailer.shipped_email(carton.id, resend: true).subject
19
+ end
20
+ it { is_expected.to match /^\[RESEND\] / }
21
+ end
22
+
23
+ context "emails must be translatable" do
24
+ context "shipped_email" do
25
+ context "pt-BR locale" do
26
+ before do
27
+ pt_br_shipped_email = { :spree => { :shipment_mailer => { :shipped_email => { :dear_customer => 'Caro Cliente,' } } } }
28
+ I18n.backend.store_translations :'pt-BR', pt_br_shipped_email
29
+ I18n.locale = :'pt-BR'
30
+ end
31
+
32
+ after do
33
+ I18n.locale = I18n.default_locale
34
+ end
35
+
36
+ specify do
37
+ shipped_email = Spree::CartonMailer.shipped_email(carton.id)
38
+ expect(shipped_email.body).to include("Caro Cliente,")
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,122 @@
1
+ require 'spec_helper'
2
+ require 'email_spec'
3
+
4
+ describe Spree::OrderMailer, :type => :mailer do
5
+ include EmailSpec::Helpers
6
+ include EmailSpec::Matchers
7
+
8
+ let(:order) do
9
+ order = stub_model(Spree::Order)
10
+ product = stub_model(Spree::Product, :name => %Q{The "BEST" product})
11
+ variant = stub_model(Spree::Variant, :product => product)
12
+ price = stub_model(Spree::Price, :variant => variant, :amount => 5.00)
13
+ store = FactoryGirl.build :store, mail_from_address: "store@example.com"
14
+ line_item = stub_model(Spree::LineItem, :variant => variant, :order => order, :quantity => 1, :price => 4.99)
15
+ allow(variant).to receive_messages(:default_price => price)
16
+ allow(order).to receive_messages(:line_items => [line_item])
17
+ allow(order).to receive(:store).and_return(store)
18
+ order
19
+ end
20
+
21
+ it "uses the order's store for the from address" do
22
+ message = Spree::OrderMailer.confirm_email(order)
23
+ expect(message.from).to eq ["store@example.com"]
24
+ end
25
+
26
+ it "doesn't aggressively escape double quotes in confirmation body" do
27
+ confirmation_email = Spree::OrderMailer.confirm_email(order)
28
+ expect(confirmation_email.body).not_to include(""")
29
+ end
30
+
31
+ it "confirm_email accepts an order id as an alternative to an Order object" do
32
+ expect(Spree::Order).to receive(:find).with(order.id).and_return(order)
33
+ expect {
34
+ Spree::OrderMailer.confirm_email(order.id).body
35
+ }.not_to raise_error
36
+ end
37
+
38
+ it "cancel_email accepts an order id as an alternative to an Order object" do
39
+ expect(Spree::Order).to receive(:find).with(order.id).and_return(order)
40
+ expect {
41
+ Spree::OrderMailer.cancel_email(order.id).body
42
+ }.not_to raise_error
43
+ end
44
+
45
+ context "only shows eligible adjustments in emails" do
46
+ before do
47
+ create(:adjustment, :order => order, :eligible => true, :label => "Eligible Adjustment")
48
+ create(:adjustment, :order => order, :eligible => false, :label => "Ineligible Adjustment")
49
+ end
50
+
51
+ let!(:confirmation_email) { Spree::OrderMailer.confirm_email(order) }
52
+ let!(:cancel_email) { Spree::OrderMailer.cancel_email(order) }
53
+
54
+ specify do
55
+ expect(confirmation_email.body).not_to include("Ineligible Adjustment")
56
+ end
57
+
58
+ specify do
59
+ expect(cancel_email.body).not_to include("Ineligible Adjustment")
60
+ end
61
+ end
62
+
63
+ context "displays unit costs from line item" do
64
+ # Regression test for #2772
65
+
66
+ # Tests mailer view spree/order_mailer/confirm_email.text.erb
67
+ specify do
68
+ confirmation_email = Spree::OrderMailer.confirm_email(order)
69
+ expect(confirmation_email).to have_body_text("4.99")
70
+ expect(confirmation_email).to_not have_body_text("5.00")
71
+ end
72
+
73
+ # Tests mailer view spree/order_mailer/cancel_email.text.erb
74
+ specify do
75
+ cancel_email = Spree::OrderMailer.cancel_email(order)
76
+ expect(cancel_email).to have_body_text("4.99")
77
+ expect(cancel_email).to_not have_body_text("5.00")
78
+ end
79
+ end
80
+
81
+ context "emails must be translatable" do
82
+
83
+ context "pt-BR locale" do
84
+ before do
85
+ I18n.enforce_available_locales = false
86
+ pt_br_confirm_mail = { :spree => { :order_mailer => { :confirm_email => { :dear_customer => 'Caro Cliente,' } } } }
87
+ pt_br_cancel_mail = { :spree => { :order_mailer => { :cancel_email => { :order_summary_canceled => 'Resumo da Pedido [CANCELADA]' } } } }
88
+ I18n.backend.store_translations :'pt-BR', pt_br_confirm_mail
89
+ I18n.backend.store_translations :'pt-BR', pt_br_cancel_mail
90
+ I18n.locale = :'pt-BR'
91
+ end
92
+
93
+ after do
94
+ I18n.locale = I18n.default_locale
95
+ I18n.enforce_available_locales = true
96
+ end
97
+
98
+ context "confirm_email" do
99
+ specify do
100
+ confirmation_email = Spree::OrderMailer.confirm_email(order)
101
+ expect(confirmation_email).to have_body_text("Caro Cliente,")
102
+ end
103
+ end
104
+
105
+ context "cancel_email" do
106
+ specify do
107
+ cancel_email = Spree::OrderMailer.cancel_email(order)
108
+ expect(cancel_email).to have_body_text("Resumo da Pedido [CANCELADA]")
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ context "with preference :send_core_emails set to false" do
115
+ it "sends no email" do
116
+ Spree::Config.send_core_emails = false
117
+ message = Spree::OrderMailer.confirm_email(order)
118
+ expect(message.body).to be_blank
119
+ end
120
+ end
121
+
122
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ require 'email_spec'
3
+
4
+ describe Spree::ReimbursementMailer, :type => :mailer do
5
+ include EmailSpec::Helpers
6
+ include EmailSpec::Matchers
7
+
8
+ let(:reimbursement) { create(:reimbursement) }
9
+
10
+ it "accepts a reimbursement id as an alternative to a Reimbursement object" do
11
+ expect(Spree::Reimbursement).to receive(:find).with(reimbursement.id).and_return(reimbursement)
12
+
13
+ expect {
14
+ Spree::ReimbursementMailer.reimbursement_email(reimbursement.id).body
15
+ }.not_to raise_error
16
+ end
17
+
18
+ context "emails must be translatable" do
19
+ context "reimbursement_email" do
20
+ context "pt-BR locale" do
21
+ before do
22
+ I18n.enforce_available_locales = false
23
+ pt_br_shipped_email = { :spree => { :reimbursement_mailer => { :reimbursement_email => { :dear_customer => 'Caro Cliente,' } } } }
24
+ I18n.backend.store_translations :'pt-BR', pt_br_shipped_email
25
+ I18n.locale = :'pt-BR'
26
+ end
27
+
28
+ after do
29
+ I18n.locale = I18n.default_locale
30
+ I18n.enforce_available_locales = true
31
+ end
32
+
33
+ specify do
34
+ reimbursement_email = Spree::ReimbursementMailer.reimbursement_email(reimbursement)
35
+ expect(reimbursement_email.body).to include("Caro Cliente,")
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+ require 'email_spec'
3
+
4
+ describe Spree::TestMailer, :type => :mailer do
5
+ include EmailSpec::Helpers
6
+ include EmailSpec::Matchers
7
+
8
+ let(:user) { create(:user) }
9
+
10
+ it "confirm_email accepts a user id as an alternative to a User object" do
11
+ expect {
12
+ test_email = Spree::TestMailer.test_email('test@example.com')
13
+ }.not_to raise_error
14
+ end
15
+ end
@@ -0,0 +1,276 @@
1
+ require 'spec_helper'
2
+ require 'cancan/matchers'
3
+ require 'spree/testing_support/ability_helpers'
4
+ require 'spree/testing_support/bar_ability'
5
+
6
+ # Fake ability for testing registration of additional abilities
7
+ class FooAbility
8
+ include CanCan::Ability
9
+
10
+ def initialize(user)
11
+ # allow anyone to perform index on Order
12
+ can :index, Spree::Order
13
+ # allow anyone to update an Order with id of 1
14
+ can :update, Spree::Order do |order|
15
+ order.id == 1
16
+ end
17
+ end
18
+ end
19
+
20
+ describe Spree::Ability, :type => :model do
21
+ let(:user) { build(:user) }
22
+ let(:ability) { Spree::Ability.new(user) }
23
+ let(:token) { nil }
24
+
25
+ after(:each) {
26
+ Spree::Ability.abilities = Set.new
27
+ }
28
+
29
+ describe "#initialize" do
30
+ subject { Spree::Ability.new(user) }
31
+
32
+ it "activates permissions from the role configuration" do
33
+ expect(Spree::RoleConfiguration.instance).to receive(:activate_permissions!).
34
+ once
35
+
36
+ subject
37
+ end
38
+ end
39
+
40
+ context 'register_ability' do
41
+ it 'should add the ability to the list of abilties' do
42
+ Spree::Ability.register_ability(FooAbility)
43
+ expect(Spree::Ability.new(user).abilities).not_to be_empty
44
+ end
45
+
46
+ it 'should apply the registered abilities permissions' do
47
+ Spree::Ability.register_ability(FooAbility)
48
+ expect(Spree::Ability.new(user).can?(:update, mock_model(Spree::Order, :id => 1))).to be true
49
+ end
50
+ end
51
+
52
+ context 'for general resource' do
53
+ let(:resource) { Object.new }
54
+
55
+ context 'with admin user' do
56
+ before(:each) { allow(user).to receive(:has_spree_role?).and_return(true) }
57
+ it_should_behave_like 'access granted'
58
+ it_should_behave_like 'index allowed'
59
+ end
60
+
61
+ context 'with customer' do
62
+ it_should_behave_like 'access denied'
63
+ it_should_behave_like 'no index allowed'
64
+ end
65
+ end
66
+
67
+ context 'for admin protected resources' do
68
+ let(:resource) { Object.new }
69
+ let(:resource_shipment) { Spree::Shipment.new }
70
+ let(:resource_product) { Spree::Product.new }
71
+ let(:resource_user) { create :user }
72
+ let(:resource_order) { Spree::Order.new }
73
+ let(:fakedispatch_user) { Spree.user_class.create }
74
+ let(:fakedispatch_ability) { Spree::Ability.new(fakedispatch_user) }
75
+
76
+ context 'with admin user' do
77
+ it 'should be able to admin' do
78
+ user.spree_roles << Spree::Role.find_or_create_by(name: 'admin')
79
+ expect(ability).to be_able_to :admin, resource
80
+ expect(ability).to be_able_to :index, resource_order
81
+ expect(ability).to be_able_to :show, resource_product
82
+ expect(ability).to be_able_to :create, resource_user
83
+ end
84
+ end
85
+
86
+ context 'with fakedispatch user' do
87
+ it 'should be able to admin on the order and shipment pages' do
88
+ user.spree_roles << Spree::Role.find_or_create_by(name: 'bar')
89
+
90
+ Spree::Ability.register_ability(BarAbility)
91
+
92
+ expect(ability).not_to be_able_to :admin, resource
93
+
94
+ expect(ability).to be_able_to :admin, resource_order
95
+ expect(ability).to be_able_to :index, resource_order
96
+ expect(ability).not_to be_able_to :update, resource_order
97
+ # ability.should_not be_able_to :create, resource_order # Fails
98
+
99
+ expect(ability).to be_able_to :admin, resource_shipment
100
+ expect(ability).to be_able_to :index, resource_shipment
101
+ expect(ability).to be_able_to :create, resource_shipment
102
+
103
+ expect(ability).not_to be_able_to :admin, resource_product
104
+ expect(ability).not_to be_able_to :update, resource_product
105
+ # ability.should_not be_able_to :show, resource_product # Fails
106
+
107
+ expect(ability).not_to be_able_to :admin, resource_user
108
+ expect(ability).not_to be_able_to :update, resource_user
109
+ expect(ability).to be_able_to :update, user
110
+ # ability.should_not be_able_to :create, resource_user # Fails
111
+ # It can create new users if is has access to the :admin, User!!
112
+
113
+ # TODO change the Ability class so only users and customers get the extra premissions?
114
+
115
+ Spree::Ability.remove_ability(BarAbility)
116
+ end
117
+ end
118
+
119
+ context 'with customer' do
120
+ it 'should not be able to admin' do
121
+ expect(ability).not_to be_able_to :admin, resource
122
+ expect(ability).not_to be_able_to :admin, resource_order
123
+ expect(ability).not_to be_able_to :admin, resource_product
124
+ expect(ability).not_to be_able_to :admin, resource_user
125
+ end
126
+ end
127
+ end
128
+
129
+ context 'as Guest User' do
130
+
131
+ context 'for Country' do
132
+ let(:resource) { Spree::Country.new }
133
+ context 'requested by any user' do
134
+ it_should_behave_like 'read only'
135
+ end
136
+ end
137
+
138
+ context 'for OptionType' do
139
+ let(:resource) { Spree::OptionType.new }
140
+ context 'requested by any user' do
141
+ it_should_behave_like 'read only'
142
+ end
143
+ end
144
+
145
+ context 'for OptionValue' do
146
+ let(:resource) { Spree::OptionType.new }
147
+ context 'requested by any user' do
148
+ it_should_behave_like 'read only'
149
+ end
150
+ end
151
+
152
+ context 'for Order' do
153
+ let(:resource) { Spree::Order.new }
154
+
155
+ context 'requested by same user' do
156
+ before(:each) { resource.user = user }
157
+ it_should_behave_like 'access granted'
158
+ it_should_behave_like 'no index allowed'
159
+ end
160
+
161
+ context 'requested by other user' do
162
+ before(:each) { resource.user = Spree.user_class.new }
163
+ it_should_behave_like 'create only'
164
+ end
165
+
166
+ context 'requested with proper token' do
167
+ let(:token) { 'TOKEN123' }
168
+ before(:each) { allow(resource).to receive_messages guest_token: 'TOKEN123' }
169
+ it_should_behave_like 'access granted'
170
+ it_should_behave_like 'no index allowed'
171
+ end
172
+
173
+ context 'requested with inproper token' do
174
+ let(:token) { 'FAIL' }
175
+ before(:each) { allow(resource).to receive_messages guest_token: 'TOKEN123' }
176
+ it_should_behave_like 'create only'
177
+ end
178
+ end
179
+
180
+ context 'for Product' do
181
+ let(:resource) { Spree::Product.new }
182
+ context 'requested by any user' do
183
+ it_should_behave_like 'read only'
184
+ end
185
+ end
186
+
187
+ context 'for ProductProperty' do
188
+ let(:resource) { Spree::Product.new }
189
+ context 'requested by any user' do
190
+ it_should_behave_like 'read only'
191
+ end
192
+ end
193
+
194
+ context 'for Property' do
195
+ let(:resource) { Spree::Product.new }
196
+ context 'requested by any user' do
197
+ it_should_behave_like 'read only'
198
+ end
199
+ end
200
+
201
+ context 'for State' do
202
+ let(:resource) { Spree::State.new }
203
+ context 'requested by any user' do
204
+ it_should_behave_like 'read only'
205
+ end
206
+ end
207
+
208
+ context 'for Stock Item' do
209
+ let(:resource) { Spree::StockItem.new }
210
+ context 'active stock location' do
211
+ before { resource.build_stock_location(active: true) }
212
+ it_should_behave_like 'read only'
213
+ end
214
+
215
+ context 'inactive stock location' do
216
+ before { resource.build_stock_location(active: false) }
217
+ it_should_behave_like 'access denied'
218
+ end
219
+ end
220
+
221
+ context 'for Stock Location' do
222
+ let(:resource) { Spree::StockLocation.new }
223
+ context 'active' do
224
+ before { resource.active = true }
225
+ it_should_behave_like 'read only'
226
+ end
227
+
228
+ context 'inactive' do
229
+ before { resource.active = false }
230
+ it_should_behave_like 'access denied'
231
+ end
232
+ end
233
+
234
+ context 'for Taxons' do
235
+ let(:resource) { Spree::Taxon.new }
236
+ context 'requested by any user' do
237
+ it_should_behave_like 'read only'
238
+ end
239
+ end
240
+
241
+ context 'for Taxonomy' do
242
+ let(:resource) { Spree::Taxonomy.new }
243
+ context 'requested by any user' do
244
+ it_should_behave_like 'read only'
245
+ end
246
+ end
247
+
248
+ context 'for User' do
249
+ context 'requested by same user' do
250
+ let(:resource) { user }
251
+ it_should_behave_like 'access granted'
252
+ it_should_behave_like 'no index allowed'
253
+ end
254
+ context 'requested by other user' do
255
+ let(:resource) { Spree.user_class.create }
256
+ it_should_behave_like 'create only'
257
+ end
258
+ end
259
+
260
+ context 'for Variant' do
261
+ let(:resource) { Spree::Variant.new }
262
+ context 'requested by any user' do
263
+ it_should_behave_like 'read only'
264
+ end
265
+ end
266
+
267
+ context 'for Zone' do
268
+ let(:resource) { Spree::Zone.new }
269
+ context 'requested by any user' do
270
+ it_should_behave_like 'read only'
271
+ end
272
+ end
273
+
274
+ end
275
+
276
+ end