UNPKG

gaf-mobile

Version:

GAF mobile Web site

452 lines (369 loc) 13 kB
'use strict'; /* 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); }); }); });