solidus_volume_pricing 0.2.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +35 -0
  3. data/.gem_release.yml +5 -0
  4. data/.github/dependabot.yml +7 -0
  5. data/.github/stale.yml +17 -0
  6. data/.gitignore +14 -9
  7. data/.rspec +2 -2
  8. data/.rubocop.yml +3 -7
  9. data/.rubocop_todo.yml +126 -0
  10. data/CHANGELOG.md +86 -0
  11. data/Gemfile +25 -2
  12. data/Guardfile +3 -1
  13. data/{LICENSE.md → LICENSE} +2 -2
  14. data/README.md +55 -50
  15. data/Rakefile +4 -19
  16. data/app/assets/javascripts/spree/backend/solidus_volume_pricing.js +1 -15
  17. data/app/controllers/spree/admin/volume_price_models_controller.rb +2 -1
  18. data/app/controllers/spree/admin/volume_prices_controller.rb +3 -1
  19. data/app/decorators/controllers/solidus_volume_pricing/spree/admin/variants_controller_decorator.rb +42 -0
  20. data/app/decorators/helpers/solidus_volume_pricing/spree/base_helper_decorator.rb +31 -0
  21. data/app/decorators/models/solidus_volume_pricing/spree/line_item_decorator.rb +18 -0
  22. data/app/decorators/models/solidus_volume_pricing/spree/variant_decorator.rb +21 -0
  23. data/app/models/solidus_volume_pricing/price_display.rb +47 -0
  24. data/app/models/solidus_volume_pricing/pricer.rb +95 -0
  25. data/app/models/solidus_volume_pricing/pricing_options.rb +20 -0
  26. data/app/models/spree/volume_price.rb +43 -26
  27. data/app/models/spree/volume_price_model.rb +6 -4
  28. data/app/overrides/spree/admin/shared/_settings_sub_menu/add_volume_price_model_admin_menu_links.html.erb.deface +5 -0
  29. data/app/overrides/views_decorator.rb +2 -0
  30. data/app/views/spree/admin/shared/_vp_product_tab.html.erb +2 -2
  31. data/app/views/spree/admin/variants/_edit_fields.html.erb +5 -32
  32. data/app/views/spree/admin/variants/volume_prices.html.erb +9 -36
  33. data/app/views/spree/admin/volume_price_models/_form.html.erb +6 -2
  34. data/app/views/spree/admin/volume_price_models/_list.html.erb +8 -4
  35. data/app/views/spree/admin/volume_price_models/_select.html.erb +17 -0
  36. data/app/views/spree/admin/volume_price_models/edit.html.erb +7 -6
  37. data/app/views/spree/admin/volume_price_models/index.html.erb +7 -5
  38. data/app/views/spree/admin/volume_price_models/new.html.erb +5 -5
  39. data/app/views/spree/admin/volume_prices/_table.html.erb +26 -0
  40. data/app/views/spree/admin/volume_prices/_volume_price_fields.html.erb +10 -8
  41. data/app/views/spree/products/_volume_pricing.html.erb +8 -8
  42. data/bin/console +17 -0
  43. data/bin/rails +12 -4
  44. data/bin/setup +8 -0
  45. data/config/locales/de.yml +17 -3
  46. data/config/locales/en.yml +21 -2
  47. data/config/locales/pt.yml +6 -2
  48. data/config/locales/ru.yml +6 -2
  49. data/config/locales/sv.yml +6 -2
  50. data/config/locales/tr.yml +6 -2
  51. data/config/routes.rb +3 -1
  52. data/db/migrate/20081119145604_create_volume_prices.rb +3 -1
  53. data/db/migrate/20110203174010_change_display_name_for_volume_prices.rb +3 -1
  54. data/db/migrate/20111206173307_prefix_volume_pricing_table_names.rb +3 -1
  55. data/db/migrate/20121115043422_add_discount_type_column.rb +3 -1
  56. data/db/migrate/20150513200904_add_role_to_volume_price.rb +3 -1
  57. data/db/migrate/20150603143015_create_spree_volume_price_models.rb +3 -1
  58. data/lib/generators/solidus_volume_pricing/install/install_generator.rb +5 -5
  59. data/lib/solidus_volume_pricing/engine.rb +16 -24
  60. data/lib/solidus_volume_pricing/range_from_string.rb +36 -0
  61. data/lib/solidus_volume_pricing/testing_support/factories.rb +14 -0
  62. data/lib/solidus_volume_pricing/version.rb +3 -16
  63. data/lib/solidus_volume_pricing.rb +6 -1
  64. data/solidus_volume_pricing.gemspec +26 -23
  65. data/spec/controllers/spree/admin/variants_controller_spec.rb +18 -15
  66. data/spec/features/manage_volume_price_models_feature_spec.rb +5 -7
  67. data/spec/features/manage_volume_prices_feature_spec.rb +9 -8
  68. data/spec/helpers/base_helper_spec.rb +3 -1
  69. data/spec/lib/solidus_volume_pricing/range_from_string_spec.rb +61 -0
  70. data/spec/models/solidus_volume_pricing/pricer_spec.rb +669 -0
  71. data/spec/models/solidus_volume_pricing/pricing_options_spec.rb +57 -0
  72. data/spec/models/spree/line_item_spec.rb +23 -21
  73. data/spec/models/spree/order_spec.rb +4 -2
  74. data/spec/models/spree/variant_spec.rb +3 -303
  75. data/spec/models/spree/volume_price_spec.rb +145 -50
  76. data/spec/spec_helper.rb +15 -35
  77. data/spec/support/shoulda.rb +11 -0
  78. metadata +83 -161
  79. data/.hound.yml +0 -40
  80. data/.travis.yml +0 -12
  81. data/CONTRIBUTING.md +0 -81
  82. data/app/controllers/spree/admin/variants_controller_decorator.rb +0 -32
  83. data/app/helpers/spree/base_helper_decorator.rb +0 -19
  84. data/app/models/spree/line_item_decorator.rb +0 -13
  85. data/app/models/spree/user_decorator.rb +0 -10
  86. data/app/models/spree/variant_decorator.rb +0 -104
  87. data/app/overrides/spree/admin/shared/sub_menu/_configuration/add_volume_price_model_admin_menu_links.html.erb.deface +0 -3
  88. data/app/views/spree/admin/volume_prices/_edit_fields.html.erb +0 -31
  89. data/spec/factories/volume_price_factory.rb +0 -12
  90. data/spec/support/capybara.rb +0 -12
  91. data/spec/support/database_cleaner.rb +0 -21
  92. data/spec/support/factory_girl.rb +0 -7
  93. data/spec/support/spree.rb +0 -10
@@ -0,0 +1,669 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.shared_examples 'having the variant price' do
6
+ it 'uses the variants price' do
7
+ expect(subject).to eq('$10.00')
8
+ end
9
+ end
10
+
11
+ RSpec.describe SolidusVolumePricing::Pricer do
12
+ let(:other_role) { create(:role) }
13
+ let(:role) { create(:role) }
14
+ let(:user) { create(:user) }
15
+ let(:variant) { create(:variant, price: 10) }
16
+
17
+ it 'inherits from default variant pricer' do
18
+ expect(described_class < Spree::Variant::PriceSelector).to be(true)
19
+ end
20
+
21
+ it 'has SolidusVolumePricing::PricingOptions as pricing options class' do
22
+ expect(described_class.pricing_options_class).to eq(SolidusVolumePricing::PricingOptions)
23
+ end
24
+
25
+ describe '#price_for' do
26
+ subject do
27
+ described_class.new(variant).price_for(pricing_options).to_s
28
+ end
29
+
30
+ let(:quantity) { 1 }
31
+
32
+ let(:pricing_options) do
33
+ SolidusVolumePricing::PricingOptions.new(quantity: quantity)
34
+ end
35
+
36
+ context 'discount_type = price' do
37
+ before do
38
+ variant.volume_prices.create!(amount: 7, discount_type: 'price', range: '(10+)')
39
+ end
40
+
41
+ context 'when quantity does not match the range' do
42
+ it_behaves_like 'having the variant price'
43
+ end
44
+
45
+ context 'when quantity matches the range' do
46
+ let(:quantity) { 10 }
47
+
48
+ it 'uses the volume price' do
49
+ expect(subject).to eq('$7.00')
50
+ end
51
+
52
+ context 'when volume price has a role' do
53
+ before do
54
+ variant.volume_prices.first.update(role_id: role.id)
55
+ end
56
+
57
+ context 'when no user is given' do
58
+ it_behaves_like 'having the variant price'
59
+ end
60
+
61
+ context 'when a user is given' do
62
+ let(:pricing_options) do
63
+ SolidusVolumePricing::PricingOptions.new(
64
+ quantity: quantity,
65
+ user: user
66
+ )
67
+ end
68
+
69
+ context 'whose role matches' do
70
+ before { user.spree_roles << role }
71
+
72
+ it 'uses the volume price' do
73
+ expect(subject).to eq('$7.00')
74
+ end
75
+ end
76
+
77
+ context 'whose role does not match' do
78
+ before { user.spree_roles << other_role }
79
+
80
+ it_behaves_like 'having the variant price'
81
+ end
82
+ end
83
+ end
84
+
85
+ context 'of a volume price model instead' do
86
+ let(:quantity) { 6 }
87
+
88
+ before do
89
+ variant.volume_price_models << create(:volume_price_model)
90
+ variant.volume_price_models.first.volume_prices.create!(amount: 5, discount_type: 'price', range: '(5+)')
91
+ end
92
+
93
+ it 'uses the volume price from model' do
94
+ expect(subject).to eq('$5.00')
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ context 'discount_type = dollar' do
101
+ before do
102
+ variant.volume_prices.create!(amount: 1, discount_type: 'dollar', range: '(10+)')
103
+ end
104
+
105
+ context 'when quantity does not match the range' do
106
+ it_behaves_like 'having the variant price'
107
+ end
108
+
109
+ context 'when quantity matches the range' do
110
+ let(:quantity) { 10 }
111
+
112
+ it 'uses the volume price' do
113
+ expect(subject).to eq('$9.00')
114
+ end
115
+
116
+ context 'when volume price has a role' do
117
+ before do
118
+ variant.volume_prices.first.update(role_id: role.id)
119
+ end
120
+
121
+ context 'when no user is given' do
122
+ it_behaves_like 'having the variant price'
123
+ end
124
+
125
+ context 'when a user is given' do
126
+ let(:pricing_options) do
127
+ SolidusVolumePricing::PricingOptions.new(
128
+ quantity: quantity,
129
+ user: user
130
+ )
131
+ end
132
+
133
+ context 'whose role matches' do
134
+ before { user.spree_roles << role }
135
+
136
+ it 'uses the volume price' do
137
+ expect(subject).to eq('$9.00')
138
+ end
139
+ end
140
+
141
+ context 'whose role does not match' do
142
+ before { user.spree_roles << other_role }
143
+
144
+ it_behaves_like 'having the variant price'
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ context 'of a volume price model instead' do
151
+ let(:quantity) { 6 }
152
+
153
+ before do
154
+ variant.volume_price_models << create(:volume_price_model)
155
+ variant.volume_price_models.first.volume_prices.create!(amount: 2, discount_type: 'dollar', range: '(5+)')
156
+ end
157
+
158
+ it 'uses the volume price from model' do
159
+ expect(subject).to eq('$8.00')
160
+ end
161
+ end
162
+ end
163
+
164
+ context 'discount_type = percent' do
165
+ before do
166
+ variant.volume_prices.create!(amount: 0.25, discount_type: 'percent', range: '(10+)')
167
+ end
168
+
169
+ context 'when quantity does not match the range' do
170
+ it_behaves_like 'having the variant price'
171
+ end
172
+
173
+ context 'when quantity matches the range' do
174
+ let(:quantity) { 10 }
175
+
176
+ it 'uses the volume price' do
177
+ expect(subject).to eq('$7.50')
178
+ end
179
+
180
+ context 'when volume price has a role' do
181
+ before do
182
+ variant.volume_prices.first.update(role_id: role.id)
183
+ end
184
+
185
+ context 'when no user is given' do
186
+ it_behaves_like 'having the variant price'
187
+ end
188
+
189
+ context 'when a user is given' do
190
+ let(:pricing_options) do
191
+ SolidusVolumePricing::PricingOptions.new(
192
+ quantity: quantity,
193
+ user: user
194
+ )
195
+ end
196
+
197
+ context 'whose role matches' do
198
+ before { user.spree_roles << role }
199
+
200
+ it 'uses the volume price' do
201
+ expect(subject).to eq('$7.50')
202
+ end
203
+ end
204
+
205
+ context 'whose role does not match' do
206
+ before { user.spree_roles << other_role }
207
+
208
+ it_behaves_like 'having the variant price'
209
+ end
210
+ end
211
+ end
212
+ end
213
+
214
+ context 'of a volume price model instead' do
215
+ let(:quantity) { 6 }
216
+
217
+ it 'uses the volume price from model' do
218
+ variant.volume_price_models << create(:volume_price_model)
219
+ variant.volume_price_models.first.volume_prices.create!(amount: 0.75, discount_type: 'percent', range: '(5+)')
220
+ expect(subject).to eq('$2.50')
221
+ end
222
+ end
223
+ end
224
+
225
+ context 'discount_type is unknown' do
226
+ before do
227
+ variant.volume_prices.create(amount: 7, discount_type: 'foo', range: '(10+)')
228
+ end
229
+
230
+ it_behaves_like 'having the variant price'
231
+ end
232
+
233
+ context 'when use_master_variant_volume_pricing' do
234
+ let(:master) { variant.product.master }
235
+
236
+ before do
237
+ stub_spree_preferences(use_master_variant_volume_pricing: use_master_variant_volume_pricing)
238
+ master.volume_prices.create!(amount: 1.5, discount_type: 'price', range: '(1+)')
239
+ variant.volume_prices.create!(amount: 3.5, discount_type: 'price', range: '(1+)')
240
+ end
241
+
242
+ context 'is enabled' do
243
+ let(:use_master_variant_volume_pricing) { true }
244
+
245
+ context 'when volume prices are present on variant' do
246
+ it 'uses the variant to compute price' do
247
+ expect(subject).to eq('$3.50')
248
+ end
249
+ end
250
+
251
+ context 'when no volume prices present on variant' do
252
+ before do
253
+ variant.volume_prices.delete_all
254
+ end
255
+
256
+ it 'uses the master variant to compute price' do
257
+ expect(subject).to eq('$1.50')
258
+ end
259
+ end
260
+ end
261
+
262
+ context 'is disabled' do
263
+ let(:use_master_variant_volume_pricing) { false }
264
+
265
+ it 'uses the master variant to compute price' do
266
+ expect(subject).to eq('$3.50')
267
+ end
268
+ end
269
+ end
270
+ end
271
+
272
+ describe '#earning_amount' do
273
+ subject do
274
+ described_class.new(variant).earning_amount(pricing_options).to_s
275
+ end
276
+
277
+ let(:pricing_options) do
278
+ SolidusVolumePricing::PricingOptions.new(quantity: quantity)
279
+ end
280
+
281
+ context 'discount_type = price' do
282
+ before do
283
+ variant.volume_prices.create!(amount: 9, discount_type: 'price', range: '(10+)')
284
+ end
285
+
286
+ context 'when quantity matches range' do
287
+ let(:quantity) { 10 }
288
+
289
+ it 'gives amount earning' do
290
+ expect(subject).to eq('$1.00')
291
+ end
292
+
293
+ context 'when volume_price has role' do
294
+ before do
295
+ variant.volume_prices.first.update(role_id: role.id)
296
+ end
297
+
298
+ context 'when user is given' do
299
+ let(:pricing_options) do
300
+ SolidusVolumePricing::PricingOptions.new(
301
+ quantity: quantity,
302
+ user: user
303
+ )
304
+ end
305
+
306
+ context 'whose role matches' do
307
+ before do
308
+ user.spree_roles << role
309
+ end
310
+
311
+ it 'gives amount earning' do
312
+ expect(subject).to eq('$1.00')
313
+ end
314
+ end
315
+
316
+ context 'whose role does not match' do
317
+ before do
318
+ user.spree_roles << other_role
319
+ end
320
+
321
+ it 'gives zero earning amount' do
322
+ expect(subject).to eq('$0.00')
323
+ end
324
+ end
325
+ end
326
+
327
+ context 'when no user is given' do
328
+ it 'gives zero earning amount' do
329
+ expect(subject).to eq('$0.00')
330
+ end
331
+ end
332
+ end
333
+ end
334
+
335
+ context 'when quantity does not match range' do
336
+ let(:quantity) { 1 }
337
+
338
+ it 'gives zero earning amount' do
339
+ expect(subject).to eq('$0.00')
340
+ end
341
+ end
342
+ end
343
+
344
+ context 'discount_type = dollar' do
345
+ before do
346
+ variant.volume_prices.create!(amount: 2.5, discount_type: 'dollar', range: '(10+)')
347
+ end
348
+
349
+ context 'when amount matches range' do
350
+ let(:quantity) { 10 }
351
+
352
+ it 'gives amount earning' do
353
+ expect(subject).to eq('$2.50')
354
+ end
355
+
356
+ context 'when volume_price has role' do
357
+ before do
358
+ variant.volume_prices.first.update(role_id: role.id)
359
+ end
360
+
361
+ context 'when user is given' do
362
+ let(:pricing_options) do
363
+ SolidusVolumePricing::PricingOptions.new(
364
+ quantity: quantity,
365
+ user: user
366
+ )
367
+ end
368
+
369
+ context 'whose role matches' do
370
+ before do
371
+ user.spree_roles << role
372
+ end
373
+
374
+ it 'gives amount earning' do
375
+ expect(subject).to eq('$2.50')
376
+ end
377
+ end
378
+
379
+ context 'whose role does not match' do
380
+ before do
381
+ user.spree_roles << other_role
382
+ end
383
+
384
+ it 'gives zero earning amount' do
385
+ expect(subject).to eq('$0.00')
386
+ end
387
+ end
388
+ end
389
+
390
+ context 'when no user is given' do
391
+ it 'gives zero earning amount' do
392
+ expect(subject).to eq('$0.00')
393
+ end
394
+ end
395
+ end
396
+ end
397
+
398
+ context 'when amount does not match range' do
399
+ let(:quantity) { 1 }
400
+
401
+ it 'gives zero earning amount' do
402
+ expect(subject).to eq('$0.00')
403
+ end
404
+ end
405
+ end
406
+
407
+ context 'discount_type = percent' do
408
+ before do
409
+ variant.volume_prices.create!(amount: 0.75, discount_type: 'percent', range: '(10+)')
410
+ end
411
+
412
+ context 'when amount matches range' do
413
+ let(:quantity) { 10 }
414
+
415
+ it 'gives amount earning' do
416
+ expect(subject).to eq('$7.50')
417
+ end
418
+
419
+ context 'when volume_price has role' do
420
+ before do
421
+ variant.volume_prices.first.update(role_id: role.id)
422
+ end
423
+
424
+ context 'when user is given' do
425
+ let(:pricing_options) do
426
+ SolidusVolumePricing::PricingOptions.new(
427
+ quantity: quantity,
428
+ user: user
429
+ )
430
+ end
431
+
432
+ context 'whose role matches' do
433
+ before do
434
+ user.spree_roles << role
435
+ end
436
+
437
+ it 'gives amount earning' do
438
+ expect(subject).to eq('$7.50')
439
+ end
440
+ end
441
+
442
+ context 'whose role does not match' do
443
+ before do
444
+ user.spree_roles << other_role
445
+ end
446
+
447
+ it 'gives zero earning amount' do
448
+ expect(subject).to eq('$0.00')
449
+ end
450
+ end
451
+ end
452
+
453
+ context 'when no user is given' do
454
+ it 'gives zero earning amount' do
455
+ expect(subject).to eq('$0.00')
456
+ end
457
+ end
458
+ end
459
+ end
460
+
461
+ context 'when amount does not match range' do
462
+ let(:quantity) { 1 }
463
+
464
+ it 'gives zero earning amount' do
465
+ expect(subject).to eq('$0.00')
466
+ end
467
+ end
468
+ end
469
+ end
470
+
471
+ describe '#earning_percent' do
472
+ subject do
473
+ described_class.new(variant).earning_percent(pricing_options)
474
+ end
475
+
476
+ let(:pricing_options) do
477
+ SolidusVolumePricing::PricingOptions.new(quantity: quantity)
478
+ end
479
+
480
+ context 'discount_type = price' do
481
+ before do
482
+ variant.volume_prices.create!(amount: 9, discount_type: 'price', range: '(10+)')
483
+ end
484
+
485
+ context 'when quantity matches range' do
486
+ let(:quantity) { 10 }
487
+
488
+ it 'gives percent of earning' do
489
+ expect(subject).to eq(10)
490
+ end
491
+
492
+ context 'when volume_price has role' do
493
+ before do
494
+ variant.volume_prices.first.update(role_id: role.id)
495
+ end
496
+
497
+ context 'when user is given' do
498
+ let(:pricing_options) do
499
+ SolidusVolumePricing::PricingOptions.new(
500
+ quantity: quantity,
501
+ user: user
502
+ )
503
+ end
504
+
505
+ context 'whose role matches' do
506
+ before do
507
+ user.spree_roles << role
508
+ end
509
+
510
+ it 'gives percent of earning if role matches' do
511
+ expect(subject).to eq(10)
512
+ end
513
+ end
514
+
515
+ context 'whose role doesnt match' do
516
+ before do
517
+ user.spree_roles << other_role
518
+ end
519
+
520
+ it 'gives zero percent earning' do
521
+ expect(subject).to eq(0)
522
+ end
523
+ end
524
+ end
525
+
526
+ context 'when no user is given' do
527
+ it 'gives zero earning amount' do
528
+ expect(subject).to eq(0)
529
+ end
530
+ end
531
+ end
532
+ end
533
+
534
+ context 'when quantity does not match range' do
535
+ let(:quantity) { 1 }
536
+
537
+ it 'gives zero percent earning' do
538
+ expect(subject).to eq(0)
539
+ end
540
+ end
541
+ end
542
+
543
+ context 'discount_type = dollar' do
544
+ before do
545
+ variant.volume_prices.create!(amount: 2.5, discount_type: 'dollar', range: '(10+)')
546
+ end
547
+
548
+ context 'when quantity matches range' do
549
+ let(:quantity) { 10 }
550
+
551
+ it 'gives percent of earning' do
552
+ expect(subject).to eq(25)
553
+ end
554
+
555
+ context 'when volume_price has role' do
556
+ before do
557
+ variant.volume_prices.first.update(role_id: role.id)
558
+ end
559
+
560
+ context 'when user is given' do
561
+ let(:pricing_options) do
562
+ SolidusVolumePricing::PricingOptions.new(
563
+ quantity: quantity,
564
+ user: user
565
+ )
566
+ end
567
+
568
+ context 'whose role matches' do
569
+ before do
570
+ user.spree_roles << role
571
+ end
572
+
573
+ it 'gives percent of earning if role matches' do
574
+ expect(subject).to eq(25)
575
+ end
576
+ end
577
+
578
+ context 'whose role doesnt match' do
579
+ before do
580
+ user.spree_roles << other_role
581
+ end
582
+
583
+ it 'gives zero percent earning' do
584
+ expect(subject).to eq(0)
585
+ end
586
+ end
587
+ end
588
+
589
+ context 'when no user is given' do
590
+ it 'gives zero earning amount' do
591
+ expect(subject).to eq(0)
592
+ end
593
+ end
594
+ end
595
+ end
596
+
597
+ context 'when quantity does not match range' do
598
+ let(:quantity) { 1 }
599
+
600
+ it 'gives zero percent earning' do
601
+ expect(subject).to eq(0)
602
+ end
603
+ end
604
+ end
605
+
606
+ context 'discount_type = percent' do
607
+ before do
608
+ variant.volume_prices.create!(amount: 0.25, discount_type: 'percent', range: '(10+)')
609
+ end
610
+
611
+ context 'when quantity matches range' do
612
+ let(:quantity) { 10 }
613
+
614
+ it 'gives percent of earning' do
615
+ expect(subject).to eq(25)
616
+ end
617
+
618
+ context 'when volume_price has role' do
619
+ before do
620
+ variant.volume_prices.first.update(role_id: role.id)
621
+ end
622
+
623
+ context 'when user is given' do
624
+ let(:pricing_options) do
625
+ SolidusVolumePricing::PricingOptions.new(
626
+ quantity: quantity,
627
+ user: user
628
+ )
629
+ end
630
+
631
+ context 'whose role matches' do
632
+ before do
633
+ user.spree_roles << role
634
+ end
635
+
636
+ it 'gives percent of earning if role matches' do
637
+ expect(subject).to eq(25)
638
+ end
639
+ end
640
+
641
+ context 'whose role doesnt match' do
642
+ before do
643
+ user.spree_roles << other_role
644
+ end
645
+
646
+ it 'gives zero percent earning' do
647
+ expect(subject).to eq(0)
648
+ end
649
+ end
650
+ end
651
+
652
+ context 'when no user is given' do
653
+ it 'gives zero earning amount' do
654
+ expect(subject).to eq(0)
655
+ end
656
+ end
657
+ end
658
+ end
659
+
660
+ context 'when quantity does not match range' do
661
+ let(:quantity) { 1 }
662
+
663
+ it 'gives zero percent earning' do
664
+ expect(subject).to eq(0)
665
+ end
666
+ end
667
+ end
668
+ end
669
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe SolidusVolumePricing::PricingOptions do
6
+ let(:user) do
7
+ build_stubbed(:user)
8
+ end
9
+
10
+ it 'inherits from default pricing options class' do
11
+ expect(described_class < Spree::Variant::PricingOptions).to be(true)
12
+ end
13
+
14
+ describe 'new instances' do
15
+ subject do
16
+ described_class.new(quantity: 10, user: user)
17
+ end
18
+
19
+ it 'have a quantity attribute' do
20
+ expect(subject.quantity).to eq(10)
21
+ end
22
+
23
+ it 'have a user attribute' do
24
+ expect(subject.user).to eq(user)
25
+ end
26
+
27
+ it 'desired_attributes dont have quantity key' do
28
+ expect(subject.desired_attributes).not_to have_key(:quantity)
29
+ end
30
+
31
+ it 'desired_attributes dont have user key' do
32
+ expect(subject.desired_attributes).not_to have_key(:user)
33
+ end
34
+ end
35
+
36
+ describe '.from_line_item' do
37
+ subject do
38
+ described_class.from_line_item(line_item)
39
+ end
40
+
41
+ let(:order) do
42
+ build_stubbed(:order, user: user)
43
+ end
44
+
45
+ let(:line_item) do
46
+ build_stubbed(:line_item, quantity: 2, order: order)
47
+ end
48
+
49
+ it 'sets quantity to quantity of line item' do
50
+ expect(subject.quantity).to eq(2)
51
+ end
52
+
53
+ it 'sets user to user of line item' do
54
+ expect(subject.user).to eq(user)
55
+ end
56
+ end
57
+ end