gaf-mobile
Version:
GAF mobile Web site
317 lines (273 loc) • 10.2 kB
JavaScript
'use strict';
describe('Controller: NavCtrl', function () {
// Vars
var $scope, $location, $rootScope, $q, $httpBackend, $route, createCtrl;
// Mocks
var AuthMock, UserMock, AnalyticsMock, CookieStoreMock, snapRemoteMock;
var WindowMock, MembershipsMock;
// User object
var userData = {
get: function() {
return {
fullname: 'Chuck Norris',
primary_currency: { id: 1 }
};
},
getAvatarUrl: function() {
return 'url';
},
getRole: function() {
return 'employer';
}
};
// load the controller's module
beforeEach(module('gafMobileApp'));
// Initialize the controller
beforeEach(inject(function($controller, _$rootScope_, _$location_, _$q_,
_$httpBackend_, _$route_) {
$location = _$location_;
$rootScope = _$rootScope_;
$scope = $rootScope.$new();
$q = _$q_;
$httpBackend = _$httpBackend_;
$route = _$route_;
// Controller constructer to enable to tweak the
// mock ups before instantiate it
createCtrl = function() {
return $controller('NavCtrl', {
$scope: $scope,
$rootScope: $rootScope,
$location: $location,
$window: WindowMock,
Auth: AuthMock,
Users: UserMock,
Analytics: AnalyticsMock,
CookieStore: CookieStoreMock,
snapRemote: snapRemoteMock,
Memberships: MembershipsMock
});
};
}));
// Create the mock ups
beforeEach(function() {
AuthMock = jasmine.createSpyObj('Auth', ['isAuthenticated',
'getUserId']);
AnalyticsMock = jasmine.createSpyObj('Analytics', ['trackError',
'trackEvent', 'getTrackingHeader', 'trackABTest']);
CookieStoreMock = jasmine.createSpyObj('CookieStore', ['put', 'get']);
snapRemoteMock = jasmine.createSpyObj('snapRemote', ['getSnapper']);
snapRemoteMock.getSnapper.and.returnValue($q.when({ on :
function(string, fn) {
fn('event', 'button');
}}));
UserMock = jasmine.createSpyObj('Users', ['getLoggedInUser']);
UserMock.getLoggedInUser.and.returnValue($q.when(userData));
var documentEvents = jasmine.createSpyObj('document', ['dispatchEvent',
'createEvent']);
WindowMock = {
navigator : {
userAgent: ''
},
document: documentEvents
};
MembershipsMock = jasmine.createSpyObj('Memberships', ['getTrialPackages']);
$location.host = function() { return 'm.freelancer.com'; };
});
describe('method: hideCustomAppBanners()', function() {
it('should return set showCustomAppBanners to false', function() {
WindowMock.navigator.userAgent = 'iPhone';
var ctrl = createCtrl();
ctrl.hideCustomAppBanners();
expect(ctrl.showCustomAppBanners).toBeFalsy();
});
});
it('user object should be null if user is not logged in', function() {
AuthMock.isAuthenticated.and.returnValue(false);
var ctrl = createCtrl();
expect(ctrl.user).toEqual(null);
expect(ctrl.avatar).toEqual(null);
});
it('should disable nav drawer when user is not logged in', function() {
AuthMock.isAuthenticated.and.returnValue(false);
var ctrl = createCtrl();
expect(ctrl.snapOptions.touchToDrag).toEqual(false);
});
it('should load user if the user is logged in', function() {
AuthMock.isAuthenticated.and.returnValue(true);
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.user).toEqual(userData.get());
expect(ctrl.avatar).toEqual(userData.getAvatarUrl());
});
it('should get upsell membership trial if logged in as freelancer',
function() {
userData.getRole = function() { return 'freelancer'; };
AuthMock.isAuthenticated.and.returnValue(true);
MembershipsMock.getTrialPackages.and.returnValue($q.when());
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.upsellTrial).toBeTruthy();
MembershipsMock.getTrialPackages.and.returnValue($q.reject());
ctrl = createCtrl();
$scope.$digest();
expect(ctrl.upsellTrial).toBeFalsy();
});
it('should not get membership trial packages if not freelancer', function() {
userData.getRole = function() { return 'employer'; };
AuthMock.isAuthenticated.and.returnValue(true);
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.upsellTrial).toBeFalsy();
});
it('should show login bar and nav drawer if the user is logged in',
function() {
AuthMock.isAuthenticated.and.returnValue(true);
MembershipsMock.getTrialPackages.and.returnValue($q.reject());
var ctrl = createCtrl();
$scope.$digest();
expect(ctrl.hideLoginBar).toBe(false);
expect(ctrl.snapOptions.touchToDrag).toBe(true);
});
it('should track error event when cannot get logged in user', function() {
AuthMock.isAuthenticated.and.returnValue(true);
UserMock.getLoggedInUser.and.returnValue($q.reject({}));
createCtrl();
$scope.$digest();
expect(AnalyticsMock.trackError).toHaveBeenCalled();
});
it('should store the return URL & go to the login page', function() {
AuthMock.isAuthenticated.and.returnValue(false);
UserMock.getLoggedInUser.and.returnValue($q.reject({}));
$location.url('/post-project');
var ctrl = createCtrl();
$scope.$digest();
ctrl.login();
expect($location.path()).toBe('/login');
expect($location.search().return).toBe('/post-project');
});
it('should avoid duplicating return params on login', function() {
AuthMock.isAuthenticated.and.returnValue(false);
UserMock.getLoggedInUser.and.returnValue($q.reject({}));
$location.url('/post-project?return=post-project');
var ctrl = createCtrl();
$scope.$digest();
ctrl.login();
expect($location.url()).toBe('/login?return=post-project');
});
it('should store the return URL & go to the login page', function() {
AuthMock.isAuthenticated.and.returnValue(false);
UserMock.getLoggedInUser.and.returnValue($q.reject({}));
$location.url('/post-project');
var ctrl = createCtrl();
$scope.$digest();
ctrl.login();
expect($location.path()).toBe('/login');
expect($location.search().return).toBe('/post-project');
});
it('should store the return URL & go to the signup page', function() {
AuthMock.isAuthenticated.and.returnValue(false);
UserMock.getLoggedInUser.and.returnValue($q.reject({}));
$location.url('/post-project');
var ctrl = createCtrl();
$scope.$digest();
ctrl.signup();
expect($location.path()).toBe('/signup');
expect($location.search().return).toBe('/post-project');
});
it('should redirect to home page after logout', function() {
AuthMock.isAuthenticated.and.returnValue(false);
UserMock.getLoggedInUser.and.returnValue($q.reject({}));
$location.url('/post-project');
var ctrl = createCtrl();
$scope.$digest();
ctrl.logout();
expect($location.path()).toBe('/logout');
expect($location.search().return).toBe('/');
});
it('should start new project when post project button is clicked',
function() {
AuthMock.isAuthenticated.and.returnValue(false);
UserMock.getLoggedInUser.and.returnValue($q.reject({}));
var ctrl = createCtrl();
$scope.$digest();
ctrl.startNewProject();
expect($location.url()).toBe('/post-project');
});
describe('Method: isRouteMatched()', function() {
it('should match route with input and return true if matched',
function() {
var ctrl = createCtrl();
$location.url('/some-path/mobile-web');
var routeMatch = ctrl.isRouteMatched('some-path');
expect(routeMatch).toBeTruthy();
});
it('should match route with input and return false if not matched',
function() {
var ctrl = createCtrl();
$location.url('/some-not-path/mobile-web');
var routeMatch = ctrl.isRouteMatched('some-path');
expect(routeMatch).toBeFalsy();
});
});
it('should hide header when noheader is specified on url',
function() {
$location.search({ noheader: true });
var ctrl = createCtrl();
expect(CookieStoreMock.put).toHaveBeenCalledWith('hideheader', true);
expect(ctrl.hideHeader).toBe(true);
expect(ctrl.snapOptions.touchToDrag).toBe(false);
});
it('should hide header when cookie hideheader is present',
function() {
CookieStoreMock.get.and.returnValue(true);
var ctrl = createCtrl();
expect(ctrl.hideHeader).toBe(true);
expect(ctrl.snapOptions.touchToDrag).toBe(false);
});
it('should hide header when cookie hideheader is present',
function() {
CookieStoreMock.get.and.returnValue(true);
var ctrl = createCtrl();
expect(ctrl.hideHeader).toBe(true);
expect(ctrl.snapOptions.touchToDrag).toBe(false);
});
it('should hide login bar when url is login and signup',
function() {
AuthMock.isAuthenticated.and.returnValue(false);
$httpBackend.expect('GET', '/views/login.html').respond({});
$httpBackend.expect('GET', '/views/main.html').respond({});
$location.path('/');
var ctrl = createCtrl();
$scope.$digest();
$location.path('/login');
$rootScope.$digest();
expect($route.current.controller).toBe('LoginCtrl');
expect(ctrl.hideLoginBar).toBe(true);
});
it('should track if button was the trigger on drawer event', function() {
createCtrl();
$scope.$digest();
expect(AnalyticsMock.trackEvent).toHaveBeenCalledWith('Nav', null, 'Menu',
'event');
});
it('should track if button was the trigger on drawer event', function() {
snapRemoteMock.getSnapper.and.returnValue($q.when({ on :
function(string, fn) {
fn('event', 'drag');
}}));
createCtrl();
$scope.$digest();
expect(AnalyticsMock.trackEvent).toHaveBeenCalledWith('Nav', null,
'MenuDrag', 'event');
});
it('should track if button was the trigger on drawer event', function() {
snapRemoteMock.getSnapper.and.returnValue($q.when({ on :
function(string, fn) {
fn('event', 'tap');
}}));
createCtrl();
$scope.$digest();
expect(AnalyticsMock.trackEvent).toHaveBeenCalledWith('Nav', null,
'MenuTap', 'event');
});
});