gaf-mobile
Version:
GAF mobile Web site
355 lines (303 loc) • 10.6 kB
JavaScript
/* 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 +
'¤cy=' + 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();
});
});
});
;