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,132 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PermissionSets::RestrictedTransferManagement do
4
+ let(:ability) { Spree::Ability.new(user) }
5
+
6
+ subject { ability }
7
+
8
+ let!(:source_location) { create :stock_location }
9
+ let!(:destination_location) { create :stock_location }
10
+
11
+ # This has the side effect of creating a stock item for each stock location above,
12
+ # which is what we actually want.
13
+ let!(:variant) { create :variant }
14
+
15
+ let(:source_stock_item) { source_location.stock_items.first }
16
+ let(:destination_stock_item) { destination_location.stock_items.first }
17
+
18
+ let(:transfer_with_source) { create :stock_transfer, source_location: source_location }
19
+ let(:transfer_with_destination) { create :stock_transfer, source_location: destination_location }
20
+ let(:transfer_with_source_and_destination) do
21
+ create :stock_transfer, source_location: source_location, destination_location: destination_location
22
+ end
23
+
24
+ let(:transfer_amount) { 1 }
25
+ let(:source_transfer_item) do
26
+ transfer_with_source.transfer_items.create(variant: variant, expected_quantity: transfer_amount)
27
+ end
28
+ let(:destination_transfer_item) do
29
+ transfer_with_destination.transfer_items.create(variant: variant, expected_quantity: transfer_amount)
30
+ end
31
+ let(:source_and_destination_transfer_item) do
32
+ transfer_with_source_and_destination.transfer_items.create(variant: variant, expected_quantity: transfer_amount)
33
+ end
34
+
35
+ context "when activated" do
36
+ let(:user) { create :user, stock_locations: stock_locations }
37
+ let(:stock_locations) {[]}
38
+
39
+ before do
40
+ user.stock_locations = stock_locations
41
+ # When creating transfer_items for a stock transfer, stock items must have a count on hand
42
+ # with an amount that would allow a transfer item to pass validations (meaning the count on hand has to be equal
43
+ # to the expected_quantity for the transfer)
44
+ variant.stock_items.update_all count_on_hand: transfer_amount
45
+
46
+ described_class.new(ability).activate!
47
+ end
48
+
49
+ it { is_expected.to be_able_to(:display, Spree::StockItem) }
50
+ it { is_expected.to be_able_to(:display, Spree::StockTransfer) }
51
+ it { is_expected.to be_able_to(:admin, Spree::StockItem) }
52
+ it { is_expected.to be_able_to(:admin, Spree::StockTransfer) }
53
+
54
+ context "when the user is associated with one of the locations" do
55
+ let(:stock_locations) {[source_location]}
56
+
57
+ it { is_expected.to be_able_to(:update, source_stock_item) }
58
+ it { is_expected.not_to be_able_to(:update, destination_stock_item) }
59
+
60
+ it { is_expected.to be_able_to(:transfer, source_location) }
61
+ it { is_expected.not_to be_able_to(:transfer, destination_location) }
62
+
63
+ it { is_expected.to be_able_to(:manage, transfer_with_source) }
64
+ it { is_expected.not_to be_able_to(:manage, transfer_with_destination) }
65
+ it { is_expected.not_to be_able_to(:manage, transfer_with_source_and_destination) }
66
+
67
+ it { is_expected.to be_able_to(:manage, source_transfer_item) }
68
+ it { is_expected.not_to be_able_to(:manage, destination_transfer_item) }
69
+ it { is_expected.not_to be_able_to(:manage, source_and_destination_transfer_item) }
70
+ end
71
+
72
+
73
+ context "when the user is associated with both locations" do
74
+ let(:stock_locations) {[source_location, destination_location]}
75
+
76
+ it { is_expected.to be_able_to(:update, source_stock_item) }
77
+ it { is_expected.to be_able_to(:update, destination_stock_item) }
78
+
79
+ it { is_expected.to be_able_to(:transfer, source_location) }
80
+ it { is_expected.to be_able_to(:transfer, destination_location) }
81
+
82
+ it { is_expected.to be_able_to(:manage, transfer_with_source) }
83
+ it { is_expected.to be_able_to(:manage, transfer_with_destination) }
84
+ it { is_expected.to be_able_to(:manage, transfer_with_source_and_destination) }
85
+
86
+ it { is_expected.to be_able_to(:manage, source_transfer_item) }
87
+ it { is_expected.to be_able_to(:manage, destination_transfer_item) }
88
+ it { is_expected.to be_able_to(:manage, source_and_destination_transfer_item) }
89
+ end
90
+
91
+ context "when the user is associated with neither location" do
92
+ let(:stock_locations) {[]}
93
+
94
+ it { is_expected.not_to be_able_to(:update, source_stock_item) }
95
+ it { is_expected.not_to be_able_to(:update, destination_stock_item) }
96
+
97
+ it { is_expected.not_to be_able_to(:transfer, source_location) }
98
+ it { is_expected.not_to be_able_to(:transfer, destination_location) }
99
+
100
+ it { is_expected.not_to be_able_to(:manage, transfer_with_source) }
101
+ it { is_expected.not_to be_able_to(:manage, transfer_with_destination) }
102
+ it { is_expected.not_to be_able_to(:manage, transfer_with_source_and_destination) }
103
+
104
+ it { is_expected.not_to be_able_to(:manage, source_transfer_item) }
105
+ it { is_expected.not_to be_able_to(:manage, destination_transfer_item) }
106
+ it { is_expected.not_to be_able_to(:manage, source_and_destination_transfer_item) }
107
+ end
108
+ end
109
+
110
+ context "when not activated" do
111
+ let(:user) { create :user }
112
+
113
+ it { is_expected.not_to be_able_to(:display, Spree::StockTransfer) }
114
+ it { is_expected.not_to be_able_to(:admin, Spree::StockItem) }
115
+ it { is_expected.not_to be_able_to(:admin, Spree::StockTransfer) }
116
+
117
+ it { is_expected.not_to be_able_to(:update, source_stock_item) }
118
+ it { is_expected.not_to be_able_to(:update, destination_stock_item) }
119
+
120
+ it { is_expected.not_to be_able_to(:transfer, source_location) }
121
+ it { is_expected.not_to be_able_to(:transfer, destination_location) }
122
+
123
+ it { is_expected.not_to be_able_to(:manage, transfer_with_source) }
124
+ it { is_expected.not_to be_able_to(:manage, transfer_with_destination) }
125
+ it { is_expected.not_to be_able_to(:manage, transfer_with_source_and_destination) }
126
+
127
+ it { is_expected.not_to be_able_to(:manage, source_transfer_item) }
128
+ it { is_expected.not_to be_able_to(:manage, destination_transfer_item) }
129
+ it { is_expected.not_to be_able_to(:manage, source_and_destination_transfer_item) }
130
+ end
131
+ end
132
+
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PermissionSets::StockDisplay do
4
+ let(:ability) { DummyAbility.new }
5
+
6
+ subject { ability }
7
+
8
+ context "when activated" do
9
+ before do
10
+ described_class.new(ability).activate!
11
+ end
12
+
13
+ it { is_expected.to be_able_to(:display, Spree::StockItem) }
14
+ it { is_expected.to be_able_to(:display, Spree::StockTransfer) }
15
+ it { is_expected.to be_able_to(:admin, Spree::StockItem) }
16
+ it { is_expected.to be_able_to(:admin, Spree::StockTransfer) }
17
+ end
18
+
19
+ context "when not activated" do
20
+ it { is_expected.not_to be_able_to(:display, Spree::StockItem) }
21
+ it { is_expected.not_to be_able_to(:display, Spree::StockTransfer) }
22
+ it { is_expected.not_to be_able_to(:admin, Spree::StockItem) }
23
+ it { is_expected.not_to be_able_to(:admin, Spree::StockTransfer) }
24
+ end
25
+ end
26
+
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PermissionSets::StockManagement do
4
+ let(:ability) { DummyAbility.new }
5
+
6
+ subject { ability }
7
+
8
+ context "when activated" do
9
+ before do
10
+ described_class.new(ability).activate!
11
+ end
12
+
13
+ it { is_expected.to be_able_to(:manage, Spree::StockItem) }
14
+ it { is_expected.to be_able_to(:manage, Spree::StockTransfer) }
15
+ it { is_expected.to be_able_to(:manage, Spree::TransferItem) }
16
+ end
17
+
18
+ context "when not activated" do
19
+ it { is_expected.not_to be_able_to(:manage, Spree::StockItem) }
20
+ it { is_expected.not_to be_able_to(:manage, Spree::StockTransfer) }
21
+ it { is_expected.not_to be_able_to(:manage, Spree::TransferItem) }
22
+ end
23
+ end
24
+
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PermissionSets::UserDisplay do
4
+ let(:ability) { DummyAbility.new }
5
+
6
+ subject { ability }
7
+
8
+ context "when activated" do
9
+ before do
10
+ described_class.new(ability).activate!
11
+ end
12
+
13
+ it { is_expected.to be_able_to(:display, Spree.user_class) }
14
+ it { is_expected.to be_able_to(:admin, Spree.user_class) }
15
+ it { is_expected.to be_able_to(:edit, Spree.user_class) }
16
+ it { is_expected.to be_able_to(:addresses, Spree.user_class) }
17
+ it { is_expected.to be_able_to(:orders, Spree.user_class) }
18
+ it { is_expected.to be_able_to(:items, Spree.user_class) }
19
+ it { is_expected.to be_able_to(:display, Spree::StoreCredit) }
20
+ it { is_expected.to be_able_to(:admin, Spree::StoreCredit) }
21
+ it { is_expected.to be_able_to(:display, Spree::Role) }
22
+ end
23
+
24
+ context "when not activated" do
25
+ it { is_expected.not_to be_able_to(:display, Spree.user_class) }
26
+ it { is_expected.not_to be_able_to(:admin, Spree.user_class) }
27
+ it { is_expected.not_to be_able_to(:edit, Spree.user_class) }
28
+ it { is_expected.not_to be_able_to(:addresses, Spree.user_class) }
29
+ it { is_expected.not_to be_able_to(:orders, Spree.user_class) }
30
+ it { is_expected.not_to be_able_to(:items, Spree.user_class) }
31
+ it { is_expected.not_to be_able_to(:display, Spree::StoreCredit) }
32
+ it { is_expected.not_to be_able_to(:admin, Spree::StoreCredit) }
33
+ it { is_expected.not_to be_able_to(:display, Spree::Role) }
34
+ end
35
+ end
36
+
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PermissionSets::UserManagement do
4
+ let(:ability) { DummyAbility.new }
5
+
6
+ subject { ability }
7
+
8
+ context "when activated" do
9
+ before do
10
+ described_class.new(ability).activate!
11
+ end
12
+
13
+ it { is_expected.to be_able_to(:manage, Spree.user_class) }
14
+ it { is_expected.not_to be_able_to(:delete, Spree.user_class) }
15
+ it { is_expected.not_to be_able_to(:destroy, Spree.user_class) }
16
+ it { is_expected.to be_able_to(:manage, Spree::StoreCredit) }
17
+ it { is_expected.to be_able_to(:display, Spree::Role) }
18
+ end
19
+
20
+ context "when not activated" do
21
+ it { is_expected.not_to be_able_to(:manage, Spree.user_class) }
22
+ it { is_expected.not_to be_able_to(:delete, Spree.user_class) }
23
+ it { is_expected.not_to be_able_to(:destroy, Spree.user_class) }
24
+ it { is_expected.not_to be_able_to(:manage, Spree::StoreCredit) }
25
+ it { is_expected.not_to be_able_to(:display, Spree::Role) }
26
+ end
27
+ end
28
+
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Preference, :type => :model do
4
+
5
+ it "should require a key" do
6
+ @preference = Spree::Preference.new
7
+ @preference.key = :test
8
+ @preference.value = true
9
+ expect(@preference).to be_valid
10
+ end
11
+
12
+ describe "type coversion for values" do
13
+ def round_trip_preference(key, value)
14
+ p = Spree::Preference.new
15
+ p.value = value
16
+ p.key = key
17
+ p.save
18
+
19
+ Spree::Preference.find_by_key(key)
20
+ end
21
+
22
+ it ":boolean" do
23
+ value = true
24
+ key = "boolean_key"
25
+ pref = round_trip_preference(key, value)
26
+ expect(pref.value).to eq value
27
+ end
28
+
29
+ it "false :boolean" do
30
+ value = false
31
+ key = "boolean_key"
32
+ pref = round_trip_preference(key, value)
33
+ expect(pref.value).to eq value
34
+ end
35
+
36
+ it ":integer" do
37
+ value = 10
38
+ key = "integer_key"
39
+ pref = round_trip_preference(key, value)
40
+ expect(pref.value).to eq value
41
+ end
42
+
43
+ it ":decimal" do
44
+ value = 1.5
45
+ key = "decimal_key"
46
+ pref = round_trip_preference(key, value)
47
+ expect(pref.value).to eq value
48
+ end
49
+
50
+ it ":string" do
51
+ value = "This is a string"
52
+ key = "string_key"
53
+ pref = round_trip_preference(key, value)
54
+ expect(pref.value).to eq value
55
+ end
56
+
57
+ it ":text" do
58
+ value = "This is a string stored as text"
59
+ key = "text_key"
60
+ pref = round_trip_preference(key, value)
61
+ expect(pref.value).to eq value
62
+ end
63
+
64
+ it ":password" do
65
+ value = "This is a password"
66
+ key = "password_key"
67
+ pref = round_trip_preference(key, value)
68
+ expect(pref.value).to eq value
69
+ end
70
+
71
+ it ":any" do
72
+ value = [1, 2]
73
+ key = "any_key"
74
+ pref = round_trip_preference(key, value)
75
+ expect(pref.value).to eq value
76
+ end
77
+
78
+ end
79
+
80
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Preferences::Configuration, :type => :model do
4
+
5
+ before :all do
6
+ class AppConfig < Spree::Preferences::Configuration
7
+ preference :color, :string, :default => :blue
8
+ end
9
+ @config = AppConfig.new
10
+ end
11
+
12
+ it "has named methods to access preferences" do
13
+ @config.color = 'orange'
14
+ expect(@config.color).to eq 'orange'
15
+ end
16
+
17
+ it "uses [ ] to access preferences" do
18
+ @config[:color] = 'red'
19
+ expect(@config[:color]).to eq 'red'
20
+ end
21
+
22
+ it "uses set/get to access preferences" do
23
+ @config.set(color: 'green')
24
+ expect(@config.get(:color)).to eq 'green'
25
+ end
26
+
27
+ end
28
+
29
+
30
+
@@ -0,0 +1,294 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Preferences::Preferable, :type => :model do
4
+
5
+ before :all do
6
+ class A
7
+ include Spree::Preferences::Preferable
8
+ attr_reader :id
9
+
10
+ def initialize
11
+ @id = rand(999)
12
+ end
13
+
14
+ def preferences
15
+ @preferences ||= default_preferences
16
+ end
17
+
18
+ preference :color, :string, :default => 'green'
19
+ end
20
+
21
+ class B < A
22
+ preference :flavor, :string
23
+ end
24
+ end
25
+
26
+ before :each do
27
+ @a = A.new
28
+ @b = B.new
29
+ end
30
+
31
+ describe "preference definitions" do
32
+ it "parent should not see child definitions" do
33
+ expect(@a.has_preference?(:color)).to be true
34
+ expect(@a.has_preference?(:flavor)).not_to be true
35
+ end
36
+
37
+ it "child should have parent and own definitions" do
38
+ expect(@b.has_preference?(:color)).to be true
39
+ expect(@b.has_preference?(:flavor)).to be true
40
+ end
41
+
42
+ it "instances have defaults" do
43
+ expect(@a.preferred_color).to eq 'green'
44
+ expect(@b.preferred_color).to eq 'green'
45
+ expect(@b.preferred_flavor).to be_nil
46
+ end
47
+
48
+ it "can be asked if it has a preference definition" do
49
+ expect(@a.has_preference?(:color)).to be true
50
+ expect(@a.has_preference?(:bad)).to be false
51
+ end
52
+
53
+ it "can be asked and raises" do
54
+ expect {
55
+ @a.has_preference! :flavor
56
+ }.to raise_error(NoMethodError, "flavor preference not defined")
57
+ end
58
+
59
+ it "has a type" do
60
+ expect(@a.preferred_color_type).to eq :string
61
+ expect(@a.preference_type(:color)).to eq :string
62
+ end
63
+
64
+ it "has a default" do
65
+ expect(@a.preferred_color_default).to eq 'green'
66
+ expect(@a.preference_default(:color)).to eq 'green'
67
+ end
68
+
69
+ it "raises if not defined" do
70
+ expect {
71
+ @a.get_preference :flavor
72
+ }.to raise_error(NoMethodError, "flavor preference not defined")
73
+ end
74
+
75
+ end
76
+
77
+ describe "preference access" do
78
+ it "handles ghost methods for preferences" do
79
+ @a.preferred_color = 'blue'
80
+ expect(@a.preferred_color).to eq 'blue'
81
+ end
82
+
83
+ it "parent and child instances have their own prefs" do
84
+ @a.preferred_color = 'red'
85
+ @b.preferred_color = 'blue'
86
+
87
+ expect(@a.preferred_color).to eq 'red'
88
+ expect(@b.preferred_color).to eq 'blue'
89
+ end
90
+
91
+ it "raises when preference not defined" do
92
+ expect {
93
+ @a.set_preference(:bad, :bone)
94
+ }.to raise_exception(NoMethodError, "bad preference not defined")
95
+ end
96
+
97
+ it "builds a hash of preferences" do
98
+ @b.preferred_flavor = :strawberry
99
+ expect(@b.preferences[:flavor]).to eq 'strawberry'
100
+ expect(@b.preferences[:color]).to eq 'green' #default from A
101
+ end
102
+
103
+ it "builds a hash of preference defaults" do
104
+ expect(@b.default_preferences).to eq({
105
+ flavor: nil,
106
+ color: 'green'
107
+ })
108
+ end
109
+
110
+ context "converts integer preferences to integer values" do
111
+ before do
112
+ A.preference :is_integer, :integer
113
+ end
114
+
115
+ it "with strings" do
116
+ @a.set_preference(:is_integer, '3')
117
+ expect(@a.preferences[:is_integer]).to eq(3)
118
+
119
+ @a.set_preference(:is_integer, '')
120
+ expect(@a.preferences[:is_integer]).to eq(0)
121
+ end
122
+
123
+ end
124
+
125
+ context "converts decimal preferences to BigDecimal values" do
126
+ before do
127
+ A.preference :if_decimal, :decimal
128
+ end
129
+
130
+ it "returns a BigDecimal" do
131
+ @a.set_preference(:if_decimal, 3.3)
132
+ expect(@a.preferences[:if_decimal].class).to eq(BigDecimal)
133
+ end
134
+
135
+ it "with strings" do
136
+ @a.set_preference(:if_decimal, '3.3')
137
+ expect(@a.preferences[:if_decimal]).to eq(3.3)
138
+
139
+ @a.set_preference(:if_decimal, '')
140
+ expect(@a.preferences[:if_decimal]).to eq(0.0)
141
+ end
142
+ end
143
+
144
+ context "converts boolean preferences to boolean values" do
145
+ before do
146
+ A.preference :is_boolean, :boolean, :default => true
147
+ end
148
+
149
+ it "with strings" do
150
+ @a.set_preference(:is_boolean, '0')
151
+ expect(@a.preferences[:is_boolean]).to be false
152
+ @a.set_preference(:is_boolean, 'f')
153
+ expect(@a.preferences[:is_boolean]).to be false
154
+ @a.set_preference(:is_boolean, 't')
155
+ expect(@a.preferences[:is_boolean]).to be true
156
+ end
157
+
158
+ it "with integers" do
159
+ @a.set_preference(:is_boolean, 0)
160
+ expect(@a.preferences[:is_boolean]).to be false
161
+ @a.set_preference(:is_boolean, 1)
162
+ expect(@a.preferences[:is_boolean]).to be true
163
+ end
164
+
165
+ it "with an empty string" do
166
+ @a.set_preference(:is_boolean, '')
167
+ expect(@a.preferences[:is_boolean]).to be false
168
+ end
169
+
170
+ it "with an empty hash" do
171
+ @a.set_preference(:is_boolean, [])
172
+ expect(@a.preferences[:is_boolean]).to be false
173
+ end
174
+ end
175
+
176
+ context "converts array preferences to array values" do
177
+ before do
178
+ A.preference :is_array, :array, default: []
179
+ end
180
+
181
+ it "with arrays" do
182
+ @a.set_preference(:is_array, [])
183
+ expect(@a.preferences[:is_array]).to eq []
184
+ end
185
+ end
186
+
187
+ context "converts hash preferences to hash values" do
188
+ before do
189
+ A.preference :is_hash, :hash, default: {}
190
+ end
191
+
192
+ it "with hash" do
193
+ @a.set_preference(:is_hash, {})
194
+ expect(@a.preferences[:is_hash]).to be_is_a(Hash)
195
+ end
196
+
197
+ it "with hash and keys are integers" do
198
+ @a.set_preference(:is_hash, {1 => 2, 3 => 4})
199
+ expect(@a.preferences[:is_hash]).to eql({1 => 2, 3 => 4})
200
+ end
201
+
202
+ it "with ancestor of a hash" do
203
+ ancestor_of_hash = ActionController::Parameters.new({ key: :value })
204
+ @a.set_preference(:is_hash, ancestor_of_hash)
205
+ expect(@a.preferences[:is_hash]).to eql({"key" => :value})
206
+ end
207
+ end
208
+
209
+ context "converts any preferences to any values" do
210
+ before do
211
+ A.preference :product_ids, :any, :default => []
212
+ A.preference :product_attributes, :any, :default => {}
213
+ end
214
+
215
+ it "with array" do
216
+ expect(@a.preferences[:product_ids]).to eq([])
217
+ @a.set_preference(:product_ids, [1, 2])
218
+ expect(@a.preferences[:product_ids]).to eq([1, 2])
219
+ end
220
+
221
+ it "with hash" do
222
+ expect(@a.preferences[:product_attributes]).to eq({})
223
+ @a.set_preference(:product_attributes, {:id => 1, :name => 2})
224
+ expect(@a.preferences[:product_attributes]).to eq({:id => 1, :name => 2})
225
+ end
226
+ end
227
+
228
+ end
229
+
230
+ describe "persisted preferables" do
231
+ before(:all) do
232
+ class CreatePrefTest < ActiveRecord::Migration
233
+ def self.up
234
+ create_table :pref_tests do |t|
235
+ t.string :col
236
+ t.text :preferences
237
+ end
238
+ end
239
+
240
+ def self.down
241
+ drop_table :pref_tests
242
+ end
243
+ end
244
+
245
+ @migration_verbosity = ActiveRecord::Migration.verbose
246
+ ActiveRecord::Migration.verbose = false
247
+ CreatePrefTest.migrate(:up)
248
+
249
+ class PrefTest < Spree::Base
250
+ preference :pref_test_pref, :string, :default => 'abc'
251
+ preference :pref_test_any, :any, :default => []
252
+ end
253
+ end
254
+
255
+ after(:all) do
256
+ CreatePrefTest.migrate(:down)
257
+ ActiveRecord::Migration.verbose = @migration_verbosity
258
+ end
259
+
260
+ before(:each) do
261
+ @pt = PrefTest.create
262
+ end
263
+
264
+ describe "pending preferences for new activerecord objects" do
265
+ it "saves preferences after record is saved" do
266
+ pr = PrefTest.new
267
+ pr.set_preference(:pref_test_pref, 'XXX')
268
+ expect(pr.get_preference(:pref_test_pref)).to eq('XXX')
269
+ pr.save!
270
+ expect(pr.get_preference(:pref_test_pref)).to eq('XXX')
271
+ end
272
+
273
+ it "saves preferences for serialized object" do
274
+ pr = PrefTest.new
275
+ pr.set_preference(:pref_test_any, [1, 2])
276
+ expect(pr.get_preference(:pref_test_any)).to eq([1, 2])
277
+ pr.save!
278
+ expect(pr.get_preference(:pref_test_any)).to eq([1, 2])
279
+ end
280
+ end
281
+
282
+ it "clear preferences when record is deleted" do
283
+ @pt.save!
284
+ @pt.preferred_pref_test_pref = 'lmn'
285
+ @pt.save!
286
+ @pt.destroy
287
+ @pt1 = PrefTest.new(:col => 'aaaa')
288
+ @pt1.id = @pt.id
289
+ @pt1.save!
290
+ expect(@pt1.get_preference(:pref_test_pref)).to eq('abc')
291
+ end
292
+ end
293
+
294
+ end