Advertisement
Guest User

Untitled

a guest
Nov 29th, 2016
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { expect } from 'meteor/practicalmeteor:chai';
  2. import { Meteor } from 'meteor/meteor';
  3. import _ from 'lodash';
  4.  
  5. describe('Wm.Pos.Sales.Services.SalesOrderItemMethods', () => {
  6.   let SalesOrderItemMethods = Wm.Pos.Sales.Methods.SalesOrderItem;
  7.   let { OrganizationService } = Wm.Pos.Core.Services;
  8.  
  9.   let SalesOrderItem = Astro.Class.get('SalesOrderItems');
  10.   let Member = Astro.Class.get('Member');
  11.   let MembersSetting = Astro.Class.get('MembersSetting');
  12.   let Deal = Astro.Class.get('Deal');
  13.   let Deals = Deal.getCollection();
  14.   let SalesOrder = Astro.Class.get('SalesOrder');
  15.   let SalesOrders = SalesOrder.getCollection();
  16.  
  17.   before(() => {
  18.     sinon.stub(OrganizationService, 'getOrganizationId', () => '420');
  19.     sinon.stub(Meteor, 'userId', () => 'user_id');
  20.   });
  21.  
  22.   after(() => {
  23.     OrganizationService.getOrganizationId.restore();
  24.     Meteor.userId.restore();
  25.   });
  26.  
  27.   let fakeDatabase = {
  28.     deals: [{
  29.       _id: 'valid_deal',
  30.       organizationId: '420',
  31.       startTime: _.pick(moment().add({ hours: -1 }).toObject(), ['hours', 'minutes', 'seconds']),
  32.       endTime: _.pick(moment().add({ hours: 1 }).toObject(), ['hours', 'minutes', 'seconds']),
  33.       discountType: '$',
  34.       discountAmount: 500,
  35.       code: 'VALID',
  36.       name: 'Valid Deal'
  37.     }, {
  38.       _id: 'bad_time',
  39.       organizationId: '420',
  40.       startTime: _.pick(moment().add({ hours: -3 }).toObject(), ['hours', 'minutes', 'seconds']),
  41.       endTime: _.pick(moment().add({ hours: -1 }).toObject(), ['hours', 'minutes', 'seconds'])
  42.     }],
  43.     salesOrders: [{
  44.       _id: 'valid_sales_order',
  45.       organizationId: '420',
  46.       memberId: 'member_1'
  47.     }],
  48.     members: [{
  49.       _id: 'member_1',
  50.       organizationId: '420',
  51.       membershipLevel: 'gold'
  52.     }, {
  53.       _id: 'member_2',
  54.       organizationId: '420',
  55.       membershiplevel: 'silver'
  56.     }],
  57.     memberSetting: {
  58.       organizationId: '420',
  59.       membershipLevelsEnabled: true
  60.     }
  61.   };
  62.  
  63.   describe('addDeal', () => {
  64.  
  65.     let methodsToStub = {
  66.       '_isLineTypeOnOrder': false,
  67.       '_isTodayValidForDeal': true,
  68.       '_hasDealExceededClaims': false,
  69.       '_hasMemberExceededDealClaims': false,
  70.       '_isMembershipLevelValidForDeal': true
  71.     };
  72.  
  73.     let stub = methods => {
  74.       _.forEach(methods, key => {
  75.         sinon.stub(SalesOrderItemMethods, key, () => methodsToStub[key]);
  76.       });
  77.     };
  78.  
  79.     let restore = methods => {
  80.       _.forEach(methods, key => {
  81.         SalesOrderItemMethods[key].restore();
  82.       });
  83.     };
  84.  
  85.     beforeEach(() => {
  86.       sinon.stub(SalesOrderItem, 'insert');
  87.       sinon.stub(SalesOrders, 'findOne', q => _.find(fakeDatabase.salesOrders, q));
  88.       sinon.stub(Deals, 'findOne', q => _.find(fakeDatabase.deals, q));
  89.       sinon.stub(Member, 'findOne', q => _.find(fakeDatabase.members, q));
  90.       stub(_.keys(methodsToStub));
  91.     });
  92.  
  93.     afterEach(() => {
  94.       SalesOrderItem.insert.restore();
  95.       SalesOrders.findOne.restore();
  96.       Deals.findOne.restore();
  97.       Member.findOne.restore();
  98.       restore(_.keys(methodsToStub));
  99.     });
  100.  
  101.     it('should add a deal to a sales order when conditions are met', () => {
  102.       let result = SalesOrderItemMethods.addDeal('valid_deal', 'valid_sales_order');
  103.       expect(result.ok).to.be.true;
  104.       expect(SalesOrderItem.insert.callCount).to.equal(1);
  105.     });
  106.     it('should prevent a deal being added at the wrong time', () => {
  107.       let result = SalesOrderItemMethods.addDeal('bad_time', 'valid_sales_order');
  108.       expect(result.ok).not.to.be.true;
  109.       expect(result.message).to.contain('deal-outside-time-allowed');
  110.     });
  111.     it('should prevent a deal being added if the line item already exists on the same order', () => {
  112.       methodsToStub._isLineTypeOnOrder = true;
  113.       let result = SalesOrderItemMethods.addDeal('valid_deal', 'valid_sales_order');
  114.       expect(result.ok).not.to.be.true;
  115.       expect(result.message).to.contain('only-one-deal-allowed');
  116.       methodsToStub._isLineTypeOnOrder = false;
  117.     });
  118.     it('should prevent a deal being added if its an invalid day', () => {
  119.       methodsToStub._isTodayValidForDeal = false;
  120.       let result = SalesOrderItemMethods.addDeal('valid_deal', 'valid_sales_order');
  121.       expect(result.ok).not.to.be.true;
  122.       expect(result.message).to.contain('invalid-day-for-deal');
  123.       methodsToStub._isTodayValidForDeal = true;
  124.     });
  125.     it('should prevent a deal being added if its claim count is exceeded', () => {
  126.       methodsToStub._hasDealExceededClaims = true;
  127.       let result = SalesOrderItemMethods.addDeal('valid_deal', 'valid_sales_order');
  128.       expect(result.ok).not.to.be.true;
  129.       expect(result.message).to.contain('maximum-claims-code');
  130.       methodsToStub._hasDealExceededClaims = false;
  131.     });
  132.     it('should prevent a deal being added if its claim per member is exceeded', () => {
  133.       methodsToStub._hasMemberExceededDealClaims = true;
  134.       let result = SalesOrderItemMethods.addDeal('valid_deal', 'valid_sales_order');
  135.       expect(result.ok).not.to.be.true;
  136.       expect(result.message).to.contain('maximum-claims-client');
  137.       methodsToStub._hasMemberExceededDealClaims = false;
  138.     });
  139.     it('should prevent a deal being added for improper membership levels', () => {
  140.       methodsToStub._isMembershipLevelValidForDeal = false;
  141.       let result = SalesOrderItemMethods.addDeal('valid_deal', 'valid_sales_order');
  142.       expect(result.ok).not.to.be.true;
  143.       expect(result.message).to.contain('invalid-membership-level');
  144.       methodsToStub._isMembershipLevelValidForDeal = true;
  145.     });
  146.   });
  147.  
  148.  
  149.  
  150.   describe('_isMembershipLevelValidForDeal', () => {
  151.  
  152.     let deal = {
  153.       applicableMembershipLevels: ['gold']
  154.     };
  155.  
  156.     beforeEach(() => {
  157.       sinon.stub(Member, 'findOne', q => _.find(fakeDatabase.members, q));
  158.       sinon.stub(MembersSetting, 'findOne', () => fakeDatabase.memberSetting);
  159.     });
  160.  
  161.     afterEach(() => {
  162.       Member.findOne.restore();
  163.       MembersSetting.findOne.restore();
  164.     });
  165.  
  166.     it('should validate the members membership level if settings are enabled', () => {
  167.       let result = SalesOrderItemMethods._isMembershipLevelValidForDeal(deal, 'member_1', '420');
  168.       expect(result).to.be.true;
  169.     });
  170.     it('should validate if settings are disabled', () => {
  171.       MembersSetting.findOne.restore();
  172.       sinon.stub(MembersSetting, 'findOne', () => ({ membershiplevelsEnabled: false }));
  173.  
  174.       let result = SalesOrderItemMethods._isMembershipLevelValidForDeal(deal, 'member_1', '420');
  175.       expect(result).to.be.true;
  176.     });
  177.     it('should not validate if deal is not for membership level', () => {
  178.       let result = SalesOrderItemMethods._isMembershipLevelValidForDeal(deal, 'member_2', '420');
  179.       expect(result).not.to.be.that.of.which.is.true;
  180.     });
  181.   });
  182.  
  183.  
  184.  
  185.   describe('_hasMemberExceededDealClaims', () => {
  186.  
  187.     let deal = {
  188.       code: 'chicken',
  189.       maximumClaimsPerClient: 2
  190.     };
  191.  
  192.     let infiniteDeal = {
  193.       code: 'butts',
  194.       maximumClaimsPerClient: 0
  195.     }
  196.  
  197.     let salesOrderItems = [{
  198.       sku: 'chicken',
  199.       memberId: '1'
  200.     }, {
  201.       sku: 'chicken',
  202.       memberId: '1'
  203.     }, {
  204.       sku: 'chicken',
  205.       memberId: '2'
  206.     }, {
  207.       sku: 'butts',
  208.       memberId: '1'
  209.     }, {
  210.       sku: 'butts',
  211.       memberId: '1'
  212.     }, {
  213.       sku: 'butts',
  214.       memberId: '1'
  215.     }];
  216.  
  217.     beforeEach(() => {
  218.       sinon.stub(SalesOrderItem, 'find', q => ({ count: () => (_.filter(salesOrderItems, _.pick(q, ['sku', 'memberId'])).length) }));
  219.     });
  220.  
  221.     afterEach(() => {
  222.       SalesOrderItem.find.restore();
  223.     });
  224.  
  225.     it('should validate if member has not exceeded claims', () => {
  226.       let result = SalesOrderItemMethods._hasMemberExceededDealClaims(deal, '2', '420');
  227.       expect(result).to.be.false;
  228.     });
  229.     it('should not validate if member has exceeded claims', () => {
  230.       let result = SalesOrderItemMethods._hasMemberExceededDealClaims(deal, '1', '420');
  231.       expect(result).to.be.true;
  232.     });
  233.     it('should validate if claims is 0', () => {
  234.       let result = SalesOrderItemMethods._hasMemberExceededDealClaims(infiniteDeal, '1', '420');
  235.       expect(result).to.be.false;
  236.     });
  237.   });
  238.  
  239.  
  240.  
  241.   describe('_hasDealExceededClaims', () => {
  242.     let infiniDeal = {
  243.       maximumClaimsPerCode: 0,
  244.       code: 'chicken'
  245.     };
  246.     let deal = {
  247.       maximumClaimsPerCode: 2,
  248.       code: 'uniquemofo'
  249.     };
  250.     let exceededDeal = {
  251.       maximumClaimsPerCode: 1,
  252.       code: 'potato'
  253.     };
  254.  
  255.     let salesOrderItems = [{
  256.       sku: 'chicken'
  257.     }, {
  258.       sku: 'chicken'
  259.     }, {
  260.       sku: 'uniquemofo'
  261.     }, {
  262.       sku: 'potato'
  263.     }];
  264.  
  265.     beforeEach(() => {
  266.       sinon.stub(SalesOrderItem, 'find', q => ({ count: () => (_.filter(salesOrderItems, _.pick(q, ['sku'])).length) }));
  267.     });
  268.  
  269.     afterEach(() => {
  270.       SalesOrderItem.find.restore();
  271.     });
  272.  
  273.     it('should validate if claims count is set to 0', () => {
  274.       let result = SalesOrderItemMethods._hasDealExceededClaims(infiniDeal, '420');
  275.       expect(result).to.equal.false;
  276.     });
  277.     it('should validate if claims are less than the set value', () => {
  278.       let result = SalesOrderItemMethods._hasDealExceededClaims(deal, '420');
  279.       expect(result).to.equal.false;
  280.     });
  281.     it('should not validate if claims are greater than the set value', () => {
  282.       let result = SalesOrderItemMethods._hasDealExceededClaims(exceededDeal, '420');
  283.       expect(result).to.equal.true;
  284.     });
  285.   });
  286.  
  287.  
  288.  
  289.   describe('_isTodayValidForDeal', () => {
  290.     let DAY = moment().format('ddd').toUpperCase();
  291.     let ANOTHER_DAY = moment().add({ days: 1 }).format('ddd').toUpperCase();
  292.  
  293.     let todaysDeal = {
  294.       validDays: [DAY]
  295.     };
  296.     let tomorrowsDeal = {
  297.       validDays: [ANOTHER_DAY]
  298.     };
  299.  
  300.     it('should validate if today falls in the array', () => {
  301.       let result = SalesOrderItemMethods._isTodayValidForDeal(todaysDeal);
  302.       expect(result).to.be.true;
  303.     });
  304.     it('should not validate if today does not fall in the array', () => {
  305.       let result = SalesOrderItemMethods._isTodayValidForDeal(tomorrowsDeal);
  306.       expect(result).to.be.false;
  307.     });
  308.   });
  309.  
  310.  
  311.  
  312.   describe('_isLineTypeOnOrder', () => {
  313.  
  314.     let salesOrderItems = [{
  315.       salesOrderId: 'with_deal',
  316.       type: 'deal'
  317.     }, {
  318.       salesOrderId: 'with_deal',
  319.       type: 'product'
  320.     }, {
  321.       salesOrderId: 'without_deal',
  322.       type: 'product'
  323.     }, {
  324.       salesOrderId: 'without_deal',
  325.       type: 'product'
  326.     }];
  327.  
  328.     beforeEach(() => {
  329.       sinon.stub(SalesOrderItem, 'find', q => ({ count: () => (_.filter(salesOrderItems, _.pick(q, ['salesOrderId', 'type'])).length) }));
  330.     });
  331.  
  332.     afterEach(() => {
  333.       SalesOrderItem.find.restore();
  334.     });
  335.  
  336.     it('should validate by checking the current sales order for another deal type', () => {
  337.       let result = SalesOrderItemMethods._isLineTypeOnOrder('deal', 'without_deal', '420');
  338.       expect(result).not.to.be.true;
  339.     });
  340.     it('should not validate by checking and finding a deal type line item on the existing order', () => {
  341.       let result = SalesOrderItemMethods._isLineTypeOnOrder('deal', 'with_deal', '420');
  342.       expect(result).to.be.true;
  343.     });
  344.   });
  345.  
  346.  
  347.  
  348. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement