UNPKG

gaf-mobile

Version:

GAF mobile Web site

343 lines (295 loc) 10.3 kB
'use strict'; /* global MembershipPackagesMock*/ describe('Controller: MembershipsCtrl', function() { var $rootScope, $scope, $q, $filter, $windowMock, $locationMock; var MembershipsMock, userMock, loggedInUserMock, currencyMock, packageMock, returnUrl; var createCtrl; beforeEach(module('gafMobileApp')); beforeEach(inject(function($controller, _$rootScope_, _$q_, _$filter_) { $rootScope = _$rootScope_; $scope = $rootScope.$new(); $q = _$q_; $filter = _$filter_; currencyMock = { get: function() { return { id: 7, sign: '₱' }; } }; loggedInUserMock = { get: function() { return userMock; }, getPrimaryCurrency: function() { return currencyMock; } }; packageMock = MembershipPackagesMock()[0].packages[0]; // just get 1 package returnUrl = '/return/here'; $locationMock = jasmine.createSpyObj('$location', ['search', 'url']); $locationMock.search.and.returnValue({ return: returnUrl }); $windowMock = { location: { href: '' } }; MembershipsMock = jasmine.createSpyObj('Memberships', ['getUpsellTrial', 'getTrialPackages', 'subscribe']); MembershipsMock.getUpsellTrial.and.returnValue($q.when({ get: function() { return packageMock; }, getVisibleBenefits: function() { return []; } })); MembershipsMock.getTrialPackages.and.returnValue($q.when({ getList: function() { return [{ get: function() { return packageMock; }, getVisibleBenefits: function() { return []; } }]; } })); MembershipsMock.subscribe.and.returnValue($q.when({})); createCtrl = function() { return $controller('MembershipsCtrl', { $scope: $scope, $rootScope: $rootScope, $q: $q, $location: $locationMock, $window: $windowMock, $filter: $filter, Memberships: MembershipsMock, loggedInUser: loggedInUserMock }); }; })); describe('Setting up the return URL upon initialization', function() { it('should get it from location param if set', function() { var ctrl = createCtrl(); expect(ctrl.returnUrl).toEqual(returnUrl); }); it('should default to /dashboard if location param is not set', function() { $locationMock.search.and.returnValue({}); var ctrl = createCtrl(); expect(ctrl.returnUrl).toEqual('/dashboard'); }); }); describe('Setting up the currency to use upon initialization', function() { it('should get the primary currency of the logged in user', function() { var ctrl = createCtrl(); expect(ctrl.userCurrency).toEqual(currencyMock.get()); }); }); describe('Setting up the upsell trial membership package', function() { describe('if service call returned a truthy value', function() { var ctrl; beforeEach(function() { ctrl = createCtrl(); $scope.$digest(); }); it('should use the value returned by the service', function() { expect(ctrl.upsellTrial).toEqual(packageMock); }); it('should set `isTrial` and `quantity` attributes to the upsell ' + 'price object to be used in subscription', function() { expect(ctrl.upsellTrialPriceDetails).toBeDefined(); expect(ctrl.upsellTrialPriceDetails.isTrial).toEqual(true); expect(ctrl.upsellTrialPriceDetails.quantity).toEqual(1); }); }); describe('if service call returned a falsy value', function() { var ctrl; beforeEach(function() { // MembershipsMock.getUpsellTrial.and.returnValue($q.reject(false)); MembershipsMock.getTrialPackages.and.returnValue($q.reject(false)); ctrl = createCtrl(); $scope.$digest(); }); it('should be undefined', function() { expect(ctrl.upsellTrial).toEqual(undefined); expect(ctrl.upsellTrialPriceDetails).not.toBeDefined(); }); it('should set location to assigned return URL', function() { expect($locationMock.url).toHaveBeenCalledWith(returnUrl); }); }); }); describe('Method: subscribe()', function() { it('should call service method to subscribe user if they are payment ' + 'verified then redirect to assigned return URL', function() { userMock = { status: { payment_verified: true } }; var priceDetails = { package_id: 123, duration: { type: 'month', cycle: 3 }, currency_id: 777, isTrial: true, quantity: 4 }; var params = { 'currency': 777, 'duration_cycle': 3, 'is_trial': true, 'quantity': 4, 'auto_renew': true }; var ctrl = createCtrl(); ctrl.subscribe(priceDetails); $scope.$digest(); expect(MembershipsMock.subscribe).toHaveBeenCalledWith(123, 'month', params); expect(ctrl.error.subscriptionError).not.toBeDefined(); expect($windowMock.location.href).toEqual(returnUrl); }); it('should redirect user to payment verification page if user has not ' + 'yet verified a payment method', function() { userMock = { status: { payment_verified: false } }; var paymentVerificationUrl = '/payments/verify' + '?return=/membership' + '&type=membership' + '&subtype=subscribe_trial' + '&membership=priceString'; var priceDetails = { amount: null, duration: { type: null } }; var ctrl = createCtrl(); spyOn(ctrl, 'getPriceString').and.returnValue('priceString'); ctrl.subscribe(priceDetails); expect($locationMock.url).toHaveBeenCalledWith(paymentVerificationUrl); }); it('should show an error message if there were problems with the ' + 'subscription request', function() { userMock = { status: { payment_verified: true } }; var priceDetails = { package_id: 123, duration: { type: 'month', cycle: 3 }, currency_id: 777, isTrial: true, quantity: 4 }; MembershipsMock.subscribe.and.returnValue($q.reject({ error_code: 500, data: { message: 'Internal error' } })); var ctrl = createCtrl(); ctrl.subscribe(priceDetails); $scope.$digest(); expect(ctrl.showUpsellTrialView).toEqual(true); expect(ctrl.error.subscriptionError).toEqual(true); expect(ctrl.error.internalError).toEqual('Internal error'); }); }); describe('Method: getPriceString()', function() { it('should construct string using currency sign, code, amount, and ' + 'duration', function() { var ctrl = createCtrl(); var actualPriceString = ctrl.getPriceString('$', 'USD', 123, 'year'); expect(actualPriceString).toEqual('$123.00 USD / year'); }); it('should construct string using currency sign, code, and amount only ' + 'if duration is falsy', function() { var ctrl = createCtrl(); var actualPriceString = ctrl.getPriceString('$', 'USD', 123); expect(actualPriceString).toEqual('$123.00 USD'); }); }); describe('Method: getBenefitDisplayText()', function() { it('should return string starting with `Unlimited`', function() { var benefitObj = { benefit_value: -1, benefit: { display_name: 'Benefit name' } }; var ctrl = createCtrl(); var actualBenefitDisplayText = ctrl.getBenefitDisplayText(benefitObj); expect(actualBenefitDisplayText).toEqual('Unlimited Benefit name'); }); it('should only return the display name', function() { var benefitObj = { benefit_value: 1, benefit: { display_name: 'Benefit name' } }; var ctrl = createCtrl(); var actualBenefitDisplayText = ctrl.getBenefitDisplayText(benefitObj); expect(actualBenefitDisplayText).toEqual('Benefit name'); }); it('should return string starting with the benefit_value', function() { var benefitObj = { benefit_value: 111, benefit: { display_name: 'Benefit name' } }; var ctrl = createCtrl(); var actualBenefitDisplayText = ctrl.getBenefitDisplayText(benefitObj); expect(actualBenefitDisplayText).toEqual('111 Benefit name'); }); it('should return string starting with benefit.value', function() { var benefitObj = { benefit_value: null, benefit: { display_name: 'Benefit name', value: 999 } }; var ctrl = createCtrl(); var actualBenefitDisplayText = ctrl.getBenefitDisplayText(benefitObj); expect(actualBenefitDisplayText).toEqual('999 Benefit name'); }); }); describe('Behavior if URL has `verified=true` param', function() { it('should subscribe user given the price details of package to upsell', function() { $locationMock.search.and.returnValue({ verified: 'true' }); var priceDetails = packageMock.prices[0]; priceDetails.isTrial = true; priceDetails.quantity = 1; var ctrl = createCtrl(); spyOn(ctrl, 'subscribe'); $scope.$digest(); expect(ctrl.subscribe).toHaveBeenCalledWith(priceDetails); }); }); describe('Determining whether to show upsell trial page or not', function() { it('should not show if there is no trial package to upsell', function() { // MembershipsMock.getUpsellTrial.and.returnValue($q.reject(false)); MembershipsMock.getTrialPackages.and.returnValue($q.reject(false)); var ctrl = createCtrl(); $scope.$digest(); expect(ctrl.showUpsellTrialView).toEqual(false); }); it('should show only if there is a trial to upsell and `verified` ' + 'param is falsy', function() { $locationMock.search.and.returnValue({ verified: null }); var ctrl = createCtrl(); $scope.$digest(); expect(ctrl.showUpsellTrialView).toEqual(true); }); }); });