UNPKG

gaf-mobile

Version:

GAF mobile Web site

355 lines (303 loc) 10.6 kB
'use strict'; /* global ProjectMock */ /* global UserMock */ /* global BidMock */ /* global MilestoneMock */ describe('Controller: CreateMilestoneModalCtrl', function() { var $rootScope, $scope, $location, $filter, $q; var createCtrl, ctrl, scopeData, project, user, milestoneMock; var MilestonesMock, CurrencyMock; var defaultProjectConfig; beforeEach(module('gafMobileApp')); beforeEach(inject(function($controller, _$rootScope_, _$q_, _$location_, _$filter_, DEFAULT_PROJECT_CONFIG) { $rootScope = _$rootScope_; $scope = $rootScope.$new(); $q = _$q_; $location = _$location_; $filter = _$filter_; defaultProjectConfig = DEFAULT_PROJECT_CONFIG; CurrencyMock = { code: 'USD', name: 'US Dollar', country: 'US', sign: '$', exchange_rate: 1, id: 1 }; MilestonesMock = jasmine.createSpyObj('Milestones', ['create']); project = ProjectMock(); project.hireme_initial_bid = { amount: 20 }; milestoneMock = MilestoneMock(); milestoneMock.bidder_id = BidMock().bidder_id; milestoneMock.bid = BidMock(); user = UserMock(); user.id = BidMock().bidder_id; scopeData = { project: project, user: user, currency: CurrencyMock }; createCtrl = function() { return $controller('CreateMilestoneModalCtrl', { $scope: $scope, $filter: $filter, $location: $location, Milestones: MilestonesMock }, scopeData); }; })); describe('Method: init', function() { it('should initialize the form after offering HM project', function() { ctrl = createCtrl(); expect(ctrl.milestoneNewAmount).toBe(10); expect(ctrl.milestoneNewDescription).toBe('Initial Milestone'); }); it('should initialize the form based on existing milestones', function() { var milestone = { bid: BidMock(), milestones: [] }; scopeData.milestone = milestone; ctrl = createCtrl(); expect(ctrl.milestoneNewAmount).toBe(Math.ceil(BidMock().amount * 0.5)); expect(ctrl.milestoneNewDescription).toBe('Initial Milestone'); }); }); describe('Method: getDefaultMilestone', function() { it('should return milestone amount and description ' + 'for the first milestone', function() { var milestone = { bid: BidMock(), milestones: [] }; scopeData.milestone = milestone; ctrl = createCtrl(); var defaultMilestone = ctrl.getDefaultMilestone(milestone); expect(defaultMilestone.amount).toBe(Math.ceil(BidMock().amount * 0.5)); expect(defaultMilestone.description).toBe('Initial Milestone'); }); it('should return milestone amount and description ' + 'for the second milestone', function() { var milestone = { bid: BidMock(), milestones: [milestoneMock] }; scopeData.milestone = milestone; ctrl = createCtrl(); var defaultMilestone = ctrl.getDefaultMilestone(milestone); expect(defaultMilestone.amount).toBe(milestoneMock.amount); expect(defaultMilestone.description).toBe('2nd milestone'); }); it('should return milestone amount and description ' + 'for the third milestone', function() { var milestone = { bid: BidMock(), milestones: [ { id: 444, time_created: 444, amount: 444, }, { id: 333, time_created: 333, amount: 333, }, ] }; scopeData.milestone = milestone; ctrl = createCtrl(); var defaultMilestone = ctrl.getDefaultMilestone(milestone); expect(defaultMilestone.amount).toBe(444); expect(defaultMilestone.description).toBe('3rd milestone'); }); it('should return milestone amount and description ' + 'for the fourth milestone and so on', function() { var milestone = { bid: BidMock(), milestones: [ { id: 444, time_created: 444, amount: 444, }, { id: 555, time_created: 555, amount: 555, }, { id: 333, time_created: 333, amount: 333, }, ] }; scopeData.milestone = milestone; ctrl = createCtrl(); var defaultMilestone = ctrl.getDefaultMilestone(milestone); expect(defaultMilestone.amount).toBe(555); expect(defaultMilestone.description).toBe('4th milestone'); }); it('should return milestone amount and description ' + 'for the 13th milestone', function() { var milestoneArr = []; for (var i = 0; i < 12; i++) { milestoneArr.push(milestoneMock); } var milestone = { bid: BidMock(), milestones: milestoneArr }; scopeData.milestone = milestone; ctrl = createCtrl(); var defaultMilestone = ctrl.getDefaultMilestone(milestone); expect(defaultMilestone.amount).toBe(666); expect(defaultMilestone.description).toBe('13th milestone'); }); it('should return milestone amount and description ' + 'for the 21st milestone', function() { var milestoneArr = []; for (var i = 0; i < 20; i++) { milestoneArr.push(milestoneMock); } var milestone = { bid: BidMock(), milestones: milestoneArr }; scopeData.milestone = milestone; ctrl = createCtrl(); var defaultMilestone = ctrl.getDefaultMilestone(milestone); expect(defaultMilestone.amount).toBe(666); expect(defaultMilestone.description).toBe('21st milestone'); }); it('Initial amount for hourly hireme projet should be set to 25% of ' + 'default work limit * budget', function() { var freelancerInfo = { bid: BidMock(), milestones: [] }; var project = ProjectMock(); project.type = 'hourly'; project.hireme = true; var defaultMilestone = ctrl.getDefaultMilestone(freelancerInfo, project); var initialAmount = freelancerInfo.bid.amount * defaultProjectConfig.hourlyCommitment * 0.25; expect(defaultMilestone.amount).toEqual(Math.ceil(initialAmount)); }); }); describe('Method: closeCreateMilestoneModal', function() { it('should close the create milestone modal', function() { ctrl = createCtrl(); ctrl.close = jasmine.createSpy('close'); ctrl.error = { 'someError': true }; ctrl.milestoneNewAmount = 10; ctrl.milestoneNewDescription = 'description'; ctrl.closeCreateMilestoneModal(); expect(ctrl.error).toEqual({}); expect(ctrl.milestoneNewAmount).toBeUndefined(); expect(ctrl.milestoneNewDescription).toBeUndefined(); }); it('should call close callback function when creating ' + 'milestone from PVP', function() { ctrl = createCtrl(); ctrl.close = jasmine.createSpy('close'); ctrl.closeCreateMilestoneModal(); expect(ctrl.close).toHaveBeenCalled(); }); }); describe('Method: createMilestone', function() { beforeEach(function() { ctrl = createCtrl(); ctrl.milestoneNewDescription = 'description'; ctrl.milestoneNewAmount = 10; }); it('should create milestone', function() { ctrl.close = jasmine.createSpy('close'); ctrl.success = jasmine.createSpy('success'); MilestonesMock.create.and.returnValue($q.when({ get: function() { return { bidder_id: 1 }; } })); ctrl.createMilestone(); $scope.$digest(); expect(ctrl.processing).toBeTruthy(); expect(MilestonesMock.create).toHaveBeenCalledWith( ProjectMock().id, milestoneMock.bidder_id, 'description', 10, 3); expect(ctrl.success).toHaveBeenCalled(); expect(ctrl.milestoneNewAmount).toBeUndefined(); expect(ctrl.milestoneNewDescription).toBeUndefined(); expect(ctrl.error).toEqual({}); }); it('should handle an invalid milestone error', function() { MilestonesMock.create.and.returnValue($q.reject({ code: 'INVALID_MILESTONE' })); ctrl.createMilestone(); $scope.$digest(); expect(ctrl.error.invalidMilestone).toBeTruthy(); }); it('should handle an unauthorized milestone error', function() { MilestonesMock.create.and.returnValue($q.reject({ code: 'UNAUTHORIZED_MILESTONE' })); ctrl.createMilestone(); $scope.$digest(); expect(ctrl.error.unauthorizedMilestone).toBeTruthy(); }); it('should handle an account details error', function() { MilestonesMock.create.and.returnValue($q.reject({ code: 'ACCOUNT_DETAILS_UPDATE_REQUIRED' })); ctrl.createMilestone(); $scope.$digest(); expect(ctrl.error.accountDetailsUpdateRequired).toBeTruthy(); }); it('should handle an invalid milestone amount format', function() { MilestonesMock.create.and.returnValue($q.reject({ code: 'INVALID_MILESTONE_AMOUNT_FORMAT' })); ctrl.createMilestone(); $scope.$digest(); expect(ctrl.error.invalidMilestoneFormat).toBeTruthy(); }); it('should handle an unaccepted project error', function() { MilestonesMock.create.and.returnValue($q.reject({ code: 'PROJECT_NOT_ACCEPTED' })); ctrl.createMilestone(); $scope.$digest(); expect(ctrl.error.projectNotAccepted).toBeTruthy(); }); it('should redirect to deposits page upon insufficient funds error ' + 'when creating new milestone', function() { MilestonesMock.create.and.returnValue($q.reject({ code: 'INSUFFICIENT_MILESTONE_FUNDS' })); ctrl.createMilestone(); $scope.$digest(); expect($location.url()).toBe('/deposit?type=milestones&subtype=create' + '&amount=' + ctrl.milestoneNewAmount + '&action=create_milestone' + '&milestones=0' + '&project=' + ctrl.project.id + '&bidder=' + ctrl.user.id + '&currency=' + ctrl.project.currency.id + '&milestone_amount=' + ctrl.milestoneNewAmount + '&descr=' + ctrl.milestoneNewDescription + '&reason=3'); }); it('should handle an unknown error', function() { MilestonesMock.create.and.returnValue($q.reject({ code: 'someError' })); ctrl.createMilestone(); $scope.$digest(); expect(ctrl.error.internalError).toBeTruthy(); }); }); });