@darkpos/pricing 1.0.78 → 1.0.80

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.
@@ -1,6 +1,10 @@
1
1
  const usePricing = require('../../index');
2
+ const mockStores = require('../mocks/stores');
2
3
 
3
- const pricingService = usePricing();
4
+ const session = {
5
+ store: mockStores[0],
6
+ };
7
+ const pricingService = usePricing(session);
4
8
 
5
9
  describe('Conditions not met for the item', () => {
6
10
  test('#1: Item pieces condition is not met, errors bag populated', () => {
@@ -42,7 +46,6 @@ describe('Conditions not met for the item', () => {
42
46
  },
43
47
  ]);
44
48
  });
45
- // Write two more tests for the other conditions
46
49
  test('#2: Item quantity condition is not met, errors bag populated', () => {
47
50
  const order = {
48
51
  id: 'ord-123',
@@ -130,4 +133,755 @@ describe('Conditions not met for the item', () => {
130
133
  },
131
134
  ]);
132
135
  });
136
+
137
+ test('#4: Item number condition is met, errors bag empty', () => {
138
+ const mod3x2 = {
139
+ _id: '68069a18766f8687858461e7',
140
+ name: '3x2',
141
+ properties: {},
142
+ type: 'discount',
143
+ tags: ['default'],
144
+ conditions: {
145
+ valid: null,
146
+ rules: [
147
+ {
148
+ key: 'itemSet',
149
+ value: { itemSet: '3' },
150
+ operand: '$eq',
151
+ },
152
+ ],
153
+ },
154
+ compute: {
155
+ type: 'percentage',
156
+ action: 'subtract',
157
+ amount: 100,
158
+ },
159
+ };
160
+
161
+ const item = {
162
+ _id: 'abc',
163
+ price: 10,
164
+ quantity: 1,
165
+ };
166
+
167
+ let order = {
168
+ id: 'ord-123',
169
+ items: [],
170
+ modifiers: [],
171
+ };
172
+
173
+ order = pricingService.order.addItem({
174
+ order,
175
+ item: { ...item, price: 2 },
176
+ }).updatedOrder;
177
+
178
+ order = pricingService.order.addItem({
179
+ order,
180
+ item: { ...item, price: 50 },
181
+ }).updatedOrder;
182
+
183
+ order = pricingService.order.addItem({ order, item }).updatedOrder;
184
+
185
+ order = pricingService.order.addItemModifier({
186
+ order,
187
+ modifier: mod3x2,
188
+ itemIndex: 0,
189
+ });
190
+ order = pricingService.order.addItemModifier({
191
+ order,
192
+ modifier: mod3x2,
193
+ itemIndex: 1,
194
+ });
195
+ order = pricingService.order.addItemModifier({
196
+ order,
197
+ modifier: mod3x2,
198
+ itemIndex: 2,
199
+ });
200
+
201
+ expect(order.items.length).toEqual(3);
202
+
203
+ order = pricingService.order.calculate(order);
204
+
205
+ expect(order.total).toBe(60);
206
+ expect(order.items[0].total).toBe(10);
207
+ expect(order.items[0].modifiers.length).toBe(1);
208
+
209
+ expect(order.items[1].total).toBe(50);
210
+ expect(order.items[1].modifiers.length).toBe(1);
211
+
212
+ expect(order.items[2].total).toBe(0);
213
+ expect(order.items[2].modifiers.length).toBe(1);
214
+ });
215
+
216
+ test('#5: Item number condition is met 2 times, errors bag empty', () => {
217
+ const mod3x2 = {
218
+ _id: '68069a18766f8687858461e7',
219
+ name: '3x2',
220
+ properties: {},
221
+ type: 'discount',
222
+ tags: ['default'],
223
+ conditions: {
224
+ valid: null,
225
+ rules: [
226
+ {
227
+ key: 'itemSet',
228
+ value: { itemSet: '3' },
229
+ operand: '$eq',
230
+ },
231
+ ],
232
+ },
233
+ compute: {
234
+ type: 'percentage',
235
+ action: 'subtract',
236
+ amount: 100,
237
+ },
238
+ };
239
+
240
+ const item = {
241
+ _id: 'abc',
242
+ price: 10,
243
+ quantity: 1,
244
+ };
245
+
246
+ let order = {
247
+ id: 'ord-123',
248
+ items: [],
249
+ modifiers: [],
250
+ };
251
+
252
+ order = pricingService.order.addItem({
253
+ order,
254
+ item: { ...item, price: 5 },
255
+ }).updatedOrder;
256
+
257
+ order = pricingService.order.addItem({
258
+ order,
259
+ item: { ...item, price: 4 },
260
+ }).updatedOrder;
261
+
262
+ order = pricingService.order.addItem({ order, item }).updatedOrder;
263
+
264
+ order = pricingService.order.addItem({
265
+ order,
266
+ item: { ...item, price: 10 },
267
+ }).updatedOrder;
268
+
269
+ order = pricingService.order.addItem({
270
+ order,
271
+ item: { ...item, price: 10 },
272
+ }).updatedOrder;
273
+
274
+ order = pricingService.order.addItem({ order, item }).updatedOrder;
275
+
276
+ order = pricingService.order.addItemModifier({
277
+ order,
278
+ modifier: mod3x2,
279
+ itemIndex: 0,
280
+ });
281
+ order = pricingService.order.addItemModifier({
282
+ order,
283
+ modifier: mod3x2,
284
+ itemIndex: 1,
285
+ });
286
+ order = pricingService.order.addItemModifier({
287
+ order,
288
+ modifier: mod3x2,
289
+ itemIndex: 2,
290
+ });
291
+ order = pricingService.order.addItemModifier({
292
+ order,
293
+ modifier: mod3x2,
294
+ itemIndex: 3,
295
+ });
296
+ order = pricingService.order.addItemModifier({
297
+ order,
298
+ modifier: mod3x2,
299
+ itemIndex: 4,
300
+ });
301
+ order = pricingService.order.addItemModifier({
302
+ order,
303
+ modifier: mod3x2,
304
+ itemIndex: 5,
305
+ });
306
+
307
+ expect(order.items.length).toEqual(6);
308
+
309
+ order = pricingService.order.calculate(order);
310
+
311
+ expect(order.total).toBe(40);
312
+ expect(order.items[0].total).toBe(10);
313
+ expect(order.items[0].modifiers.length).toBe(1);
314
+
315
+ expect(order.items[1].total).toBe(10);
316
+ expect(order.items[1].modifiers.length).toBe(1);
317
+
318
+ expect(order.items[2].total).toBe(10);
319
+ expect(order.items[2].modifiers.length).toBe(1);
320
+
321
+ expect(order.items[3].total).toBe(10);
322
+ expect(order.items[3].modifiers.length).toBe(1);
323
+
324
+ expect(order.items[4].price).toBe(4);
325
+ expect(order.items[4].total).toBe(0);
326
+ expect(order.items[4].modifiers.length).toBe(1);
327
+
328
+ expect(order.items[5].price).toBe(5);
329
+ expect(order.items[5].total).toBe(0);
330
+ expect(order.items[5].modifiers.length).toBe(1);
331
+ });
332
+
333
+ test('#6: Item number condition is met, rule is highestPrice', () => {
334
+ const mod3x2 = {
335
+ _id: '68069a18766f8687858461e7',
336
+ name: '3x2',
337
+ properties: {},
338
+ type: 'discount',
339
+ tags: ['default'],
340
+ conditions: {
341
+ valid: null,
342
+ rules: [
343
+ {
344
+ key: 'itemSet',
345
+ value: { itemSet: '3', itemRule: 'highestPrice' },
346
+ operand: '$eq',
347
+ },
348
+ ],
349
+ },
350
+ compute: {
351
+ type: 'percentage',
352
+ action: 'subtract',
353
+ amount: 100,
354
+ },
355
+ };
356
+
357
+ const item = {
358
+ _id: 'abc',
359
+ price: 10,
360
+ quantity: 1,
361
+ };
362
+
363
+ let order = {
364
+ id: 'ord-123',
365
+ items: [],
366
+ modifiers: [],
367
+ };
368
+
369
+ order = pricingService.order.addItem({
370
+ order,
371
+ item: { ...item, price: 5 },
372
+ }).updatedOrder;
373
+
374
+ order = pricingService.order.addItem({
375
+ order,
376
+ item: { ...item, price: 4 },
377
+ }).updatedOrder;
378
+
379
+ order = pricingService.order.addItem({ order, item }).updatedOrder;
380
+
381
+ order = pricingService.order.addItem({
382
+ order,
383
+ item: { ...item, price: 10 },
384
+ }).updatedOrder;
385
+
386
+ order = pricingService.order.addItem({
387
+ order,
388
+ item: { ...item, price: 10 },
389
+ }).updatedOrder;
390
+
391
+ order = pricingService.order.addItem({ order, item }).updatedOrder;
392
+
393
+ order = pricingService.order.addItemModifier({
394
+ order,
395
+ modifier: mod3x2,
396
+ itemIndex: 0,
397
+ });
398
+ order = pricingService.order.addItemModifier({
399
+ order,
400
+ modifier: mod3x2,
401
+ itemIndex: 1,
402
+ });
403
+ order = pricingService.order.addItemModifier({
404
+ order,
405
+ modifier: mod3x2,
406
+ itemIndex: 2,
407
+ });
408
+ order = pricingService.order.addItemModifier({
409
+ order,
410
+ modifier: mod3x2,
411
+ itemIndex: 3,
412
+ });
413
+ order = pricingService.order.addItemModifier({
414
+ order,
415
+ modifier: mod3x2,
416
+ itemIndex: 4,
417
+ });
418
+ order = pricingService.order.addItemModifier({
419
+ order,
420
+ modifier: mod3x2,
421
+ itemIndex: 5,
422
+ });
423
+
424
+ expect(order.items.length).toEqual(6);
425
+
426
+ order = pricingService.order.calculate(order);
427
+
428
+ expect(order.total).toBe(29);
429
+ expect(order.items[0].total).toBe(0);
430
+ expect(order.items[0].modifiers.length).toBe(1);
431
+
432
+ expect(order.items[1].total).toBe(0);
433
+ expect(order.items[1].modifiers.length).toBe(1);
434
+
435
+ expect(order.items[2].total).toBe(10);
436
+ expect(order.items[2].modifiers.length).toBe(1);
437
+
438
+ expect(order.items[3].total).toBe(10);
439
+ expect(order.items[3].modifiers.length).toBe(1);
440
+
441
+ expect(order.items[4].price).toBe(4);
442
+ expect(order.items[4].total).toBe(4);
443
+ expect(order.items[4].modifiers.length).toBe(1);
444
+
445
+ expect(order.items[5].price).toBe(5);
446
+ expect(order.items[5].total).toBe(5);
447
+ expect(order.items[5].modifiers.length).toBe(1);
448
+ });
449
+
450
+ test('#7: Item number condition is met, rule is firstSelected', () => {
451
+ const mod3x2 = {
452
+ _id: '68069a18766f8687858461e7',
453
+ name: '3x2',
454
+ properties: {},
455
+ type: 'discount',
456
+ tags: ['default'],
457
+ conditions: {
458
+ valid: null,
459
+ rules: [
460
+ {
461
+ key: 'itemSet',
462
+ value: { itemSet: '3', itemRule: 'firstSelected' },
463
+ operand: '$eq',
464
+ },
465
+ ],
466
+ },
467
+ compute: {
468
+ type: 'percentage',
469
+ action: 'subtract',
470
+ amount: 100,
471
+ },
472
+ };
473
+
474
+ const item = {
475
+ _id: 'abc',
476
+ price: 10,
477
+ quantity: 1,
478
+ };
479
+
480
+ let order = {
481
+ id: 'ord-123',
482
+ items: [],
483
+ modifiers: [],
484
+ };
485
+
486
+ order = pricingService.order.addItem({
487
+ order,
488
+ item: { ...item, price: 5 },
489
+ }).updatedOrder;
490
+
491
+ order = pricingService.order.addItem({
492
+ order,
493
+ item: { ...item, price: 4 },
494
+ }).updatedOrder;
495
+
496
+ order = pricingService.order.addItem({ order, item }).updatedOrder;
497
+
498
+ order = pricingService.order.addItem({
499
+ order,
500
+ item: { ...item, price: 10 },
501
+ }).updatedOrder;
502
+
503
+ order = pricingService.order.addItem({
504
+ order,
505
+ item: { ...item, price: 10 },
506
+ }).updatedOrder;
507
+
508
+ order = pricingService.order.addItem({ order, item }).updatedOrder;
509
+
510
+ order = pricingService.order.addItemModifier({
511
+ order,
512
+ modifier: mod3x2,
513
+ itemIndex: 0,
514
+ });
515
+ order = pricingService.order.addItemModifier({
516
+ order,
517
+ modifier: mod3x2,
518
+ itemIndex: 1,
519
+ });
520
+ order = pricingService.order.addItemModifier({
521
+ order,
522
+ modifier: mod3x2,
523
+ itemIndex: 2,
524
+ });
525
+ order = pricingService.order.addItemModifier({
526
+ order,
527
+ modifier: mod3x2,
528
+ itemIndex: 3,
529
+ });
530
+ order = pricingService.order.addItemModifier({
531
+ order,
532
+ modifier: mod3x2,
533
+ itemIndex: 4,
534
+ });
535
+ order = pricingService.order.addItemModifier({
536
+ order,
537
+ modifier: mod3x2,
538
+ itemIndex: 5,
539
+ });
540
+
541
+ expect(order.items.length).toEqual(6);
542
+
543
+ order = pricingService.order.calculate(order);
544
+
545
+ expect(order.total).toBe(40);
546
+ expect(order.items[0].total).toBe(10);
547
+ expect(order.items[0].modifiers.length).toBe(1);
548
+
549
+ expect(order.items[1].total).toBe(10);
550
+ expect(order.items[1].modifiers.length).toBe(1);
551
+
552
+ expect(order.items[2].total).toBe(10);
553
+ expect(order.items[2].modifiers.length).toBe(1);
554
+
555
+ expect(order.items[3].total).toBe(10);
556
+ expect(order.items[3].modifiers.length).toBe(1);
557
+
558
+ expect(order.items[4].price).toBe(4);
559
+ expect(order.items[4].total).toBe(0);
560
+ expect(order.items[4].modifiers.length).toBe(1);
561
+
562
+ expect(order.items[5].price).toBe(5);
563
+ expect(order.items[5].total).toBe(0);
564
+ expect(order.items[5].modifiers.length).toBe(1);
565
+ });
566
+
567
+ test('#8: Item number condition is met, rule is lastSelected', () => {
568
+ const mod3x2 = {
569
+ _id: '68069a18766f8687858461e7',
570
+ name: '3x2',
571
+ properties: {},
572
+ type: 'discount',
573
+ tags: ['default'],
574
+ conditions: {
575
+ valid: null,
576
+ rules: [
577
+ {
578
+ key: 'itemSet',
579
+ value: { itemSet: '3', itemRule: 'lastSelected' },
580
+ operand: '$eq',
581
+ },
582
+ ],
583
+ },
584
+ compute: {
585
+ type: 'percentage',
586
+ action: 'subtract',
587
+ amount: 100,
588
+ },
589
+ };
590
+
591
+ const item = {
592
+ _id: 'abc',
593
+ price: 10,
594
+ quantity: 1,
595
+ };
596
+
597
+ let order = {
598
+ id: 'ord-123',
599
+ items: [],
600
+ modifiers: [],
601
+ };
602
+
603
+ order = pricingService.order.addItem({
604
+ order,
605
+ item: { ...item, price: 5 },
606
+ }).updatedOrder;
607
+
608
+ order = pricingService.order.addItem({
609
+ order,
610
+ item: { ...item, price: 4 },
611
+ }).updatedOrder;
612
+
613
+ order = pricingService.order.addItem({ order, item }).updatedOrder;
614
+
615
+ order = pricingService.order.addItem({
616
+ order,
617
+ item: { ...item, price: 10 },
618
+ }).updatedOrder;
619
+
620
+ order = pricingService.order.addItem({
621
+ order,
622
+ item: { ...item, price: 10 },
623
+ }).updatedOrder;
624
+
625
+ order = pricingService.order.addItem({ order, item }).updatedOrder;
626
+
627
+ order = pricingService.order.addItemModifier({
628
+ order,
629
+ modifier: mod3x2,
630
+ itemIndex: 0,
631
+ });
632
+ order = pricingService.order.addItemModifier({
633
+ order,
634
+ modifier: mod3x2,
635
+ itemIndex: 1,
636
+ });
637
+ order = pricingService.order.addItemModifier({
638
+ order,
639
+ modifier: mod3x2,
640
+ itemIndex: 2,
641
+ });
642
+ order = pricingService.order.addItemModifier({
643
+ order,
644
+ modifier: mod3x2,
645
+ itemIndex: 3,
646
+ });
647
+ order = pricingService.order.addItemModifier({
648
+ order,
649
+ modifier: mod3x2,
650
+ itemIndex: 4,
651
+ });
652
+ order = pricingService.order.addItemModifier({
653
+ order,
654
+ modifier: mod3x2,
655
+ itemIndex: 5,
656
+ });
657
+
658
+ expect(order.items.length).toEqual(6);
659
+
660
+ order = pricingService.order.calculate(order);
661
+
662
+ expect(order.total).toBe(29);
663
+ expect(order.items[0].total).toBe(0);
664
+ expect(order.items[0].modifiers.length).toBe(1);
665
+
666
+ expect(order.items[1].total).toBe(0);
667
+ expect(order.items[1].modifiers.length).toBe(1);
668
+
669
+ expect(order.items[2].total).toBe(10);
670
+ expect(order.items[2].modifiers.length).toBe(1);
671
+
672
+ expect(order.items[3].total).toBe(10);
673
+ expect(order.items[3].modifiers.length).toBe(1);
674
+
675
+ expect(order.items[4].price).toBe(4);
676
+ expect(order.items[4].total).toBe(4);
677
+ expect(order.items[4].modifiers.length).toBe(1);
678
+
679
+ expect(order.items[5].price).toBe(5);
680
+ expect(order.items[5].total).toBe(5);
681
+ expect(order.items[5].modifiers.length).toBe(1);
682
+ });
683
+
684
+ test('#8: Item number condition is met using aggregatedItems, rule is lastSelected', () => {
685
+ const mod3x2 = {
686
+ _id: '68069a18766f8687858461e7',
687
+ name: '3x2',
688
+ properties: {},
689
+ type: 'discount',
690
+ tags: ['default'],
691
+ conditions: {
692
+ valid: null,
693
+ rules: [
694
+ {
695
+ key: 'itemSet',
696
+ value: { itemSet: '3', itemRule: 'lastSelected' },
697
+ operand: '$eq',
698
+ },
699
+ ],
700
+ },
701
+ compute: {
702
+ type: 'percentage',
703
+ action: 'subtract',
704
+ amount: 100,
705
+ },
706
+ };
707
+
708
+ const item = {
709
+ _id: 'abc',
710
+ price: 10,
711
+ quantity: 3,
712
+ };
713
+
714
+ let order = {
715
+ id: 'ord-123',
716
+ items: [],
717
+ modifiers: [],
718
+ };
719
+
720
+ order = pricingService.order.addItem({
721
+ order,
722
+ item,
723
+ }).updatedOrder;
724
+
725
+ order = pricingService.order.addItemModifier({
726
+ order,
727
+ modifier: mod3x2,
728
+ itemIndex: 0,
729
+ });
730
+
731
+ expect(order.items.length).toEqual(1);
732
+
733
+ order = pricingService.order.calculate(order);
734
+
735
+ expect(order.total).toBe(20);
736
+ expect(order.items[0].total).toBe(20);
737
+ expect(order.items[0].modifiers.length).toBe(1);
738
+ });
739
+
740
+ test('#9: Item number condition is met using aggregatedItems and others, rule is lastSelected', () => {
741
+ const mod3x2 = {
742
+ _id: '68069a18766f8687858461e7',
743
+ name: '3x2',
744
+ properties: {},
745
+ type: 'discount',
746
+ tags: ['default'],
747
+ conditions: {
748
+ valid: null,
749
+ rules: [
750
+ {
751
+ key: 'itemSet',
752
+ value: { itemSet: '3', itemRule: 'lastSelected' },
753
+ operand: '$eq',
754
+ },
755
+ ],
756
+ },
757
+ compute: {
758
+ type: 'percentage',
759
+ action: 'subtract',
760
+ amount: 100,
761
+ },
762
+ };
763
+
764
+ const item = {
765
+ _id: 'abc',
766
+ price: 10,
767
+ quantity: 2,
768
+ };
769
+
770
+ const item2 = {
771
+ _id: 'bcd',
772
+ price: 10,
773
+ quantity: 1,
774
+ };
775
+
776
+ let order = {
777
+ id: 'ord-123',
778
+ items: [],
779
+ modifiers: [],
780
+ };
781
+
782
+ order = pricingService.order.addItem({
783
+ order,
784
+ item,
785
+ }).updatedOrder;
786
+ order = pricingService.order.addItemModifier({
787
+ order,
788
+ modifier: mod3x2,
789
+ itemIndex: 0,
790
+ });
791
+
792
+ order = pricingService.order.addItem({
793
+ order,
794
+ item: item2,
795
+ }).updatedOrder;
796
+
797
+ order = pricingService.order.addItemModifier({
798
+ order,
799
+ modifier: mod3x2,
800
+ itemIndex: 0,
801
+ });
802
+
803
+ expect(order.items.length).toEqual(2);
804
+
805
+ order = pricingService.order.calculate(order);
806
+
807
+ expect(order.total).toBe(20);
808
+ expect(order.items[0].total).toBe(0);
809
+ expect(order.items[0].modifiers.length).toBe(1);
810
+ expect(order.items[1].total).toBe(20);
811
+ expect(order.items[1].modifiers.length).toBe(1);
812
+ });
813
+
814
+ test('#10: Item number condition is met using aggregatedItems and others, rule is lastSelected', () => {
815
+ const mod3x2 = {
816
+ _id: '68069a18766f8687858461e7',
817
+ name: '3x2',
818
+ properties: {},
819
+ type: 'discount',
820
+ tags: ['default'],
821
+ conditions: {
822
+ valid: null,
823
+ rules: [
824
+ {
825
+ key: 'itemSet',
826
+ value: { itemSet: '3', itemRule: 'lastSelected' },
827
+ operand: '$eq',
828
+ },
829
+ ],
830
+ },
831
+ compute: {
832
+ type: 'percentage',
833
+ action: 'subtract',
834
+ amount: 100,
835
+ },
836
+ };
837
+
838
+ const item = {
839
+ _id: 'abc',
840
+ price: 10,
841
+ quantity: 3,
842
+ };
843
+
844
+ const item2 = {
845
+ _id: 'bcd',
846
+ price: 10,
847
+ quantity: 3,
848
+ };
849
+
850
+ let order = {
851
+ id: 'ord-123',
852
+ items: [],
853
+ modifiers: [],
854
+ };
855
+
856
+ order = pricingService.order.addItem({
857
+ order,
858
+ item,
859
+ }).updatedOrder;
860
+ order = pricingService.order.addItemModifier({
861
+ order,
862
+ modifier: mod3x2,
863
+ itemIndex: 0,
864
+ });
865
+
866
+ order = pricingService.order.addItem({
867
+ order,
868
+ item: item2,
869
+ }).updatedOrder;
870
+
871
+ order = pricingService.order.addItemModifier({
872
+ order,
873
+ modifier: mod3x2,
874
+ itemIndex: 0,
875
+ });
876
+
877
+ expect(order.items.length).toEqual(2);
878
+
879
+ order = pricingService.order.calculate(order);
880
+
881
+ expect(order.total).toBe(40);
882
+ expect(order.items[0].total).toBe(20);
883
+ expect(order.items[0].modifiers.length).toBe(1);
884
+ expect(order.items[1].total).toBe(20);
885
+ expect(order.items[1].modifiers.length).toBe(1);
886
+ });
133
887
  });