UNPKG

gaf-mobile

Version:

GAF mobile Web site

317 lines (273 loc) 10.2 kB
'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'); }); });