gaf-mobile
Version:
GAF mobile Web site
452 lines (369 loc) • 13 kB
JavaScript
/* global UserMock */
/* global ProjectMock */
/* global BidMock */
describe('Controller: DashboardCtrl', function() {
var $location, $q, $rootScope, $scope, $window, $route;
var BidsMock, MilestoneRequestsMock, ProjectsMock, MilestonesMock;
var PagerMock, ProjectFeedMock, MembershipsMock;
var loggedInUserMock;
var projectData;
var user, project, bid, request, loader;
var createCtrl;
beforeEach(module('gafMobileApp'));
beforeEach(inject(function($controller, _$rootScope_, _$location_, _$q_,
_$window_, _$route_) {
$controller = $controller;
$rootScope = _$rootScope_;
$scope = $rootScope.$new();
$location = _$location_;
$route = _$route_;
$q = _$q_;
$window = _$window_;
createCtrl = function() {
return $controller('DashboardCtrl', {
$scope: $scope,
$rootScope: $rootScope,
$location: $location,
$route: $route,
Bids: BidsMock,
MilestoneRequests: MilestoneRequestsMock,
Milestones: MilestonesMock,
Projects: ProjectsMock,
ProjectFeed: ProjectFeedMock,
Pager: PagerMock,
Memberships: MembershipsMock,
loggedInUser: loggedInUserMock
});
};
$route.current = {};
bid = BidMock();
user = UserMock();
project = ProjectMock();
request = [];
user.jobs = [1];
user.primary_currency = { id: 1 };
projectData = {
getProjects: function() {
return [
{ get : function() { return project; }}
];
},
getList: function() {},
getSelectedBidsList: function() {}
};
}));
beforeEach(function() {
BidsMock = jasmine.createSpyObj('Bids', ['getBidderProjectsByStatus']);
MilestoneRequestsMock = jasmine.createSpyObj('MilestoneRequests',
['getMilestoneRequestsForProject']);
MilestonesMock = jasmine.createSpyObj('MilestonesMock', ['getForProject']);
ProjectsMock = jasmine.createSpyObj('Projects',
['getUserProjectsByStatus', 'searchActiveWithUserDetails']);
ProjectFeedMock = jasmine.createSpyObj('ProjectFeed', ['get']);
MembershipsMock = jasmine.createSpyObj('Memberships', ['getTrialPackages']);
loader = jasmine.createSpyObj('Pager', ['nextPage', 'hasNext',
'reset']);
loader.nextPage.and.returnValue($q.when({
getSearchTotal: function() {},
getList: function() {
return [project];
}
}));
PagerMock = function() { return loader; };
loggedInUserMock = jasmine.createSpyObj('loggedInUser', ['get', 'getRole']);
ProjectFeedMock.get.and.returnValue($q.when({
getList: function() {
return [1, 2, 3, 4, 5];
}
}));
BidsMock.getBidderProjectsByStatus.and.returnValue($q.when({
getProjects: function() {
return [{
get: function() {
return project;
}
}];
},
getList: function() {
return [project];
},
getSelectedBidsList: function() {
return [[bid]];
}
}));
loggedInUserMock.get.and.returnValue(user);
MilestonesMock.getForProject.and.returnValue(
$q.when({
get: function() {
return request;
}
}));
ProjectsMock.getUserProjectsByStatus.and.returnValue($q.when({
getProjects: function() {
return [{
get: function() {
return project;
}
}];
}
}));
MilestoneRequestsMock.getMilestoneRequestsForProject.and.returnValue(
$q.when({
get: function() { return request; }
}));
});
describe('authentication', function() {
it('should get the logged in user', function() {
var ctrl = createCtrl();
expect(ctrl.user.display_name).toBe('Chuck Norris');
expect(ctrl.user.status.phone_verified).toBeFalsy();
expect(ctrl.displayName).toBe('Chuck');
});
});
describe('initialisation', function() {
it('should call Project and Bids method on load', function() {
createCtrl();
expect(ProjectsMock.getUserProjectsByStatus).toHaveBeenCalledWith([
'open', 'work_in_progress']);
expect(BidsMock.getBidderProjectsByStatus).toHaveBeenCalledWith([
'active', 'in_progress']);
});
it('should hide spinner when methods resolve', function() {
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.showSpinner).toBeFalsy();
});
it('should show spinner upon load', function() {
var ctrl = createCtrl();
expect(ctrl.showSpinner).toBeTruthy();
});
it('should show membership upsell card if freelancer and is eligible for ' +
'membership trial', function() {
var upsellTrial = { id: 1 };
var upsellTrialObj = { get: function() { return upsellTrial; } };
var trialsList = {
getList: function() {
return [upsellTrialObj];
}
};
loggedInUserMock.getRole.and.returnValue('freelancer');
MembershipsMock.getTrialPackages.and.returnValue($q.when(trialsList));
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.upsellTrial).toEqual(upsellTrial);
});
it('should not show membership upsell card if freelancer but is not ' +
'eligible for membership trial', function() {
loggedInUserMock.getRole.and.returnValue('freelancer');
MembershipsMock.getTrialPackages.and.returnValue($q.reject());
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.upsellTrial).toBeFalsy();
});
it('should not show membership upsell card if not freelancer', function() {
loggedInUserMock.getRole.and.returnValue('employer');
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.upsellTrial).toBeFalsy();
});
});
describe('award project', function() {
it('should show card', function() {
project.status = 'active';
ProjectsMock.getUserProjectsByStatus.and
.returnValue($q.when(projectData));
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.awardProjects.length).toBe(1);
});
it('should not show card if project is not open', function() {
project.status = 'frozen';
ProjectsMock.getUserProjectsByStatus.and
.returnValue($q.when(projectData));
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.awardProjects.length).toBe(0);
});
it('should not show card if project has no bids', function() {
project.bid_stats.bid_count = 0;
ProjectsMock.getUserProjectsByStatus.and
.returnValue($q.when(projectData));
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.awardProjects.length).toBe(0);
});
});
describe('accept project', function() {
beforeEach(function() {
bid.award_status = 'pending';
project.frontend_project_status = 'open';
});
it('should show card', function() {
var ctrl = createCtrl();
ctrl.acceptProjects = [];
$scope.$digest();
expect(ctrl.acceptProjects.length).toBe(1);
});
it('should not show card if a project bid is not awarded', function() {
bid.award_status = 'not pending';
var ctrl = createCtrl();
ctrl.acceptProjects = [];
$scope.$digest();
expect(ctrl.acceptProjects.length).toBe(0);
});
});
describe('create milestone', function() {
beforeEach(function() {
project.frontend_project_status = 'work_in_progress';
});
it('should show card', function() {
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.createMilestoneProjects.length).toBe(1);
});
it('should not show card if project is not a work_in_progress', function() {
project.frontend_project_status = 'not work_in_progress';
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.createMilestoneProjects.length).toBe(0);
});
it('should not show card if project has milestones', function() {
request = ['some milestone'];
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.createMilestoneProjects.length).toBe(0);
});
});
describe('release milestone', function() {
it('should show card', function() {
ProjectsMock.getUserProjectsByStatus.and.returnValue($q.when({
getProjects: function() {
return [{
get: function() {
return {
id: 1,
seo_url: 'type/name',
frontend_project_status: 'work_in_progress'
};
}
}];
}
}));
MilestonesMock.getForProject.and.returnValue(
$q.when(
{
get: function() {
return [{ id: 1, status: 'frozen' }];
}
}));
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.releaseMilestoneProjects.length).toBe(1);
});
});
xdescribe('request milestone', function() {
beforeEach(function() {
bid.award_status = 'accepted';
bid.bidder_id = user.id;
project.frontend_project_status = 'work_in_progress';
});
it('should show card', function() {
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.cards.requestMilestone.projects.length).toBe(1);
});
it('should not show card if project is not a work_in_progress', function() {
project.frontend_project_status = 'not work_in_progress';
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.requestMilestoneProjects.length).toBe(0);
});
it('should not show card if project bid is not accepted', function() {
bid.award_status = 'not accepted';
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.requestMilestoneProjects.length).toBe(0);
});
it('should not show card if there are already milestones', function() {
request = ['some milestone'];
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.requestMilestoneProjects.length).toBe(0);
});
});
describe('recommended projects', function() {
describe('in recommended projects variation', function() {
it('should get 5 recommended projects', function() {
$route.current.isInRecommendedProjectsVariation = true;
var ctrl = createCtrl();
$scope.$digest();
expect(ProjectFeedMock.get).toHaveBeenCalledWith(5);
expect(ctrl.recommendedProjects.length).toBe(5);
});
it('should not get recommended projects if user has no jobs', function() {
$route.current.isInRecommendedProjectsVariation = true;
user.jobs = [];
var ctrl = createCtrl();
$scope.$digest();
expect(ProjectFeedMock.get).not.toHaveBeenCalled();
expect(ctrl.recommendedProjects.length).toBe(0);
});
});
});
describe('Method: clearSearchField', function() {
it('should clear the search field', function() {
var ctrl = createCtrl();
ctrl.searchQuery = 'query';
ctrl.isSearching = true;
ctrl.isShowingSearchResults = true;
ctrl.searchResults = [{ id: 1 }];
ctrl.displayingProjects = { 1: true };
ctrl.clearSearchField();
expect(ctrl.searchResults).toEqual([]);
expect(ctrl.displayingProjects).toEqual({});
expect(ctrl.searchQuery).toBe('');
expect(ctrl.isSearching).toBeFalsy();
expect(ctrl.isShowingSearchResults).toBeFalsy();
});
});
describe('Method: hasMoreProjects', function() {
it('should call nextPage method of Pager object', function() {
var ctrl = createCtrl();
ctrl.hasMoreProjects();
expect(loader.hasNext).toHaveBeenCalled();
});
});
describe('Method: projectSearch', function() {
it('should search for projects', function() {
var ctrl = createCtrl();
ctrl.projectSearch('query');
$scope.$digest();
expect(loader.nextPage).toHaveBeenCalledWith('query',
{ job_details: true });
expect(ctrl.isSearching).toBeFalsy();
expect(ctrl.isShowingSearchResults).toBeTruthy();
expect(ctrl.displayingProjects[project.id]).toBeTruthy();
expect(ctrl.searchResults).toEqual([project]);
});
it('should reset projects after each query', function() {
project = [];
var ctrl = createCtrl();
ctrl.displayingProjects[project.id] = true;
ctrl.searchResults = [{ id: 1 }];
ctrl.projectSearch('query');
$scope.$digest();
expect(loader.reset).toHaveBeenCalled();
expect(ctrl.searchResults).toEqual([[]]);
});
it('should not display a project more than once', function() {
var ctrl = createCtrl();
ctrl.displayingProjects[project.id] = true;
ctrl.searchResults = [project];
ctrl.projectSearch('query', true);
$scope.$digest();
expect(ctrl.displayingProjects[project.id]).toBeTruthy();
expect(ctrl.searchResults.length).toEqual(1);
});
});
});
;