gaf-mobile
Version:
GAF mobile Web site
342 lines (274 loc) • 10.1 kB
JavaScript
/* global ProjectMock */
/* global UserMock */
describe('JobsDirectoryManager', function() {
var $q;
var JobsDirectoryManager;
beforeEach(module('gafMobileApp'));
beforeEach(inject(function(_$q_, _JobsDirectoryManager_) {
$q = _$q_;
JobsDirectoryManager = _JobsDirectoryManager_;
}));
describe('Method: getPosition', function() {
it('should get the position', function() {
expect(JobsDirectoryManager.getPosition().page).toBe(1);
expect(JobsDirectoryManager.getPosition().scroll).toBe(0);
});
});
describe('Method: setPosition', function() {
it('should set the position', function() {
JobsDirectoryManager.setPosition({ page: 2, scroll: 1 });
expect(JobsDirectoryManager.getPosition().page).toBe(2);
expect(JobsDirectoryManager.getPosition().scroll).toBe(1);
});
});
describe('Method: getFilters', function() {
it('should get the filters', function() {
expect(JobsDirectoryManager.getFilters()).toBeUndefined();
});
});
describe('Method: getQuery', function() {
it('should get the query', function() {
expect(JobsDirectoryManager.getQuery()).toBeUndefined();
});
});
describe('Method: getUserList', function() {
it('should get the user list', function() {
expect(JobsDirectoryManager.getUserList()).toEqual({});
});
});
describe('Method: hasMoreProjects', function() {
it('should check whether there are more projects', function() {
expect(JobsDirectoryManager.hasMoreProjects()).toBeTruthy();
});
});
describe('Method: loadPage', function() {
it('should reset the projects if there is an offset', function() {
JobsDirectoryManager.loadPage(1, 'theQuery', ['filter1'], true);
expect(JobsDirectoryManager.getQuery()).toBe('theQuery');
expect(JobsDirectoryManager.getFilters()).toEqual(['filter1']);
});
it('should load the first page if no page is given', function() {
JobsDirectoryManager.loadPage();
expect(JobsDirectoryManager.getPosition().page).toBe(1);
});
});
});
describe('JobsDirectoryCtrl', function() {
var $q, $rootScope, $scope, $location;
var JobsDirectoryManagerMock, RouteMock, CategoriesMock, AnchorScrollMock;
var JobsMock;
var project, user, position, categories;
var createCtrl;
beforeEach(module('gafMobileApp'));
beforeEach(inject(function($controller, _$q_, _$rootScope_, _$location_) {
$controller = $controller;
$q = _$q_;
$location = _$location_;
$rootScope = _$rootScope_;
$scope = $rootScope.$new();
position = { page: 1, scroll: 0 };
project = ProjectMock();
user = UserMock();
categories = {
getList: function() { return [{ name: 'website', id: 1 }]; },
getJobsByCategoryId: function() {
return {
getList: function() {
return [{ active_project_count: 1, id: 1 }];
}
};
}
};
createCtrl = function() {
return $controller('JobsDirectoryCtrl', {
$controller: $controller,
$route: RouteMock,
$scope: $scope,
$anchorScroll: AnchorScrollMock,
JobsDirectoryManager: JobsDirectoryManagerMock,
Jobs: JobsMock,
Categories: CategoriesMock,
isInVariation: false
});
};
}));
beforeEach(function() {
CategoriesMock = jasmine.createSpyObj('Categories', ['getListWithJobs']);
JobsDirectoryManagerMock = jasmine.createSpyObj('JobsDirectoryManager', [
'getFilters', 'getQuery', 'getUserList', 'getPosition', 'loadPage',
'hasMoreProjects']);
JobsMock = jasmine.createSpyObj('JobsMock', ['getList']);
JobsDirectoryManagerMock.getFilters.and.returnValue('theFilters');
JobsDirectoryManagerMock.getQuery.and.returnValue('theQuery');
JobsDirectoryManagerMock.getUserList.and.returnValue([user]);
JobsDirectoryManagerMock.getPosition.and.returnValue(position);
JobsDirectoryManagerMock.hasMoreProjects.and.returnValue(false);
JobsDirectoryManagerMock.loadPage.and.returnValue($q.when([]));
CategoriesMock.getListWithJobs.and.returnValue($q.when(categories));
JobsMock.getList.and.returnValue($q.when({
getList: function() {
return [];
}
}));
AnchorScrollMock = jasmine.createSpy('$anchorScroll');
RouteMock = {
current: {
locals: {
projects: [project],
job: { get: function() { return { name: 'theJob' }; } }
}
}
};
});
it('should load categories', function() {
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.loading).toBeFalsy();
expect(ctrl.categories[1].name).toBe('website');
});
it('should store active project counts as 0 by default', function() {
categories.getJobsByCategoryId = function() {
return {
getList: function() {
return [{ id: 1 }];
}
};
};
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.categories[1].active_project_count).toBe(0);
});
it('should load the initial parameters, projects and job names', function() {
var ctrl = createCtrl();
expect(ctrl.filters).toBe('theFilters');
expect(ctrl.jobName).toBe('theJob');
expect(ctrl.projects.length).toBe(1);
expect(ctrl.projects[0].id).toBe(project.id);
expect(ctrl.query).toBe('theQuery');
});
it('should create job name if query is available', function() {
RouteMock.current.locals.job = undefined;
var ctrl = createCtrl();
expect(ctrl.jobName).toBe('theQuery');
});
it('should not create a job name if no job or query', function() {
JobsDirectoryManagerMock.getQuery.and.returnValue(undefined);
RouteMock.current.locals.job = undefined;
var ctrl = createCtrl();
expect(ctrl.jobName).toBe(undefined);
});
it('should set the first page next url to the second page', function() {
var path = $location.path();
var ctrl = createCtrl();
expect(JobsDirectoryManagerMock.getPosition).toHaveBeenCalled();
expect(ctrl.position.page).toBe(1);
expect(ctrl.nextPageUrl).toBe(path + '/2');
});
it('should set the next page url', function() {
JobsDirectoryManagerMock.getPosition.and.returnValue(position);
position.page = 2;
var path = $location.path();
var ctrl = createCtrl();
expect(JobsDirectoryManagerMock.getPosition).toHaveBeenCalled();
expect(ctrl.position.page).not.toBe(1);
expect(ctrl.nextPageUrl).toBe(path + position.page);
});
describe('Method: changeTab', function() {
it('should change the tab', function() {
var ctrl = createCtrl();
$scope.$digest();
ctrl.changeTab('sometab');
expect($scope.tab.name).toBe('sometab');
});
it('should reload jobs page if recommended tab', function() {
$location.hash('somehash');
var ctrl = createCtrl();
$scope.$digest();
ctrl.changeTab('recommended');
expect($location.path()).toBe('/jobs');
});
it('should scroll if the same tab', function() {
var ctrl = createCtrl();
$scope.$digest();
ctrl.changeTab('recommended');
ctrl.changeTab('recommended');
expect(AnchorScrollMock).toHaveBeenCalled();
});
});
describe('Method: showCategory', function() {
it('should set the category', function() {
var ctrl = createCtrl();
$scope.$digest();
ctrl.showCategory(1);
expect(ctrl.category.name).toBe('website');
});
it('should redirect to /jobs/localjobs when local is chosen', function() {
var ctrl = createCtrl();
$scope.$digest();
ctrl.showCategory(12);
expect($location.path()).toBe('/jobs/localjobs');
});
});
describe('Method: changeFilters', function() {
it('should reload the filters', function() {
var newFilter = 'theNewFilters';
var newQuery = 'theNewQuery';
var ctrl = createCtrl();
ctrl.changeFilters(newFilter, newQuery);
expect(ctrl.filters = 'theNewFilters');
expect(JobsDirectoryManagerMock.loadPage).toHaveBeenCalled();
});
it('should reload the projects', function() {
var ctrl = createCtrl();
ctrl.changeFilters();
$scope.$digest();
expect(JobsDirectoryManagerMock.loadPage).toHaveBeenCalled();
});
});
describe('Method: loadMoreRecent', function() {
it('should load more projects if not already loading', function() {
var ctrl = createCtrl();
var pagePosition = ctrl.position.page;
ctrl.loadMoreRecent();
$scope.$digest();
expect(ctrl.position.page).toBe(pagePosition - 1);
expect(JobsDirectoryManagerMock.loadPage).toHaveBeenCalled();
expect(ctrl.projects.length).toBe(0);
});
it('should not load more projects if already loading', function() {
var ctrl = createCtrl();
var pagePosition = ctrl.position.page;
ctrl.isLoadingMoreRecent = true;
ctrl.loadMoreRecent();
expect(ctrl.position.page).toBe(pagePosition);
});
});
describe('Method: loadMoreProjects', function() {
it('should load more projects if not already loading', function() {
var ctrl = createCtrl();
var pagePosition = ctrl.position.page;
ctrl.loadMoreProjects();
$scope.$digest();
expect(ctrl.position.page).toBe(pagePosition + 1);
expect(JobsDirectoryManagerMock.loadPage).toHaveBeenCalled();
expect(ctrl.projects.length).toBe(0);
});
it('should not load more projects if already loading', function() {
var ctrl = createCtrl();
var pagePosition = ctrl.position.page;
ctrl.isLoadingMore = true;
ctrl.loadMoreProjects();
expect(ctrl.position.page).toBe(pagePosition);
});
});
describe('Method: startProjectFromJob', function() {
it('should redirect to post projects', function() {
var ctrl = createCtrl();
ctrl.startProjectFromJob();
$scope.$digest();
expect(JobsMock.getList).toHaveBeenCalled();
expect($location.path()).toBe('/post-project/custom');
});
});
});
;