diff --git a/awx/ui/static/js/helpers/License.js b/awx/ui/static/js/helpers/License.js index baf98feed5..f0834a6426 100644 --- a/awx/ui/static/js/helpers/License.js +++ b/awx/ui/static/js/helpers/License.js @@ -73,7 +73,7 @@ function($rootScope, $compile, CreateDialog, Store, LicenseUpdateForm, GenerateF else if (this.getRemainingDays(license.time_remaining) < 15) { title = "License Warning"; html = "

Thank you for using Ansible Tower. The Ansible Tower license " + - "has " + this.getRemainingDays(license.time_remaining) + " remaining. Once the license expires you will no longer be able to add managed hosts or run playbooks.

" + + "has " + this.getRemainingDays(license.time_remaining) + " days remaining. Once the license expires you will no longer be able to add managed hosts or run playbooks.

" + "

Extend your Ansible Tower license by visiting ansible.com/license."; } else if (license.free_instances <= 0) { diff --git a/awx/ui/tests/e2e/CheckLicense.js b/awx/ui/tests/e2e/CheckLicense.js new file mode 100644 index 0000000000..229d35b543 --- /dev/null +++ b/awx/ui/tests/e2e/CheckLicense.js @@ -0,0 +1,23 @@ +/********************************** + * Copyright (c) 2014 AnsibleWorks, Inc. + * + * CheckLicense.js + * + * Tests the CheckLicense service- helpers/CheckLicense.js + * + */ + + /* global describe, it, expect, browser */ + + +describe('E2E:CheckLicense', function() { + it('should present login dialog', function() { + browser.get('http://localhost:8013'); + var msg = $('#login-modal .login-alert:eq(1)'); + expect(msg.getText()).toMatch(/Please sign in/); + + /*element(by.model('login_username')).sendKeys('admin'); + element(by.model('login_password')).sendKeys('password'); + element(by.id('login-button')).click();*/ + }); +}); \ No newline at end of file diff --git a/awx/ui/tests/karma-unit.conf b/awx/ui/tests/karma-unit.conf index 7e520361a6..05239f9cb6 100644 --- a/awx/ui/tests/karma-unit.conf +++ b/awx/ui/tests/karma-unit.conf @@ -9,6 +9,7 @@ module.exports = function(config) { // list of files / patterns to load in the browser conf.files = conf.files.concat([ '../static/lib/angular-mocks/angular-mocks.js', + '../../../node_modules/ng-midway-tester/src/ngMidwayTester.js', './unit/*' ]); diff --git a/awx/ui/tests/protractor-e2e.conf b/awx/ui/tests/protractor-e2e.conf new file mode 100644 index 0000000000..c4df53799e --- /dev/null +++ b/awx/ui/tests/protractor-e2e.conf @@ -0,0 +1,4 @@ +exports.config = { + seleniumAddress: 'http://localhost:4444/wd/hub', + specs: ['e2e/*.js'] +} diff --git a/awx/ui/tests/unit/CheckLicense.js b/awx/ui/tests/unit/CheckLicense.js index 8e0274312c..f9a24d5081 100644 --- a/awx/ui/tests/unit/CheckLicense.js +++ b/awx/ui/tests/unit/CheckLicense.js @@ -7,15 +7,59 @@ * */ -describe('Unit:CheckLicense', function() { + /* global describe, it, beforeEach, expect, module, inject */ - var scope; + var licenses = [{ + desc: 'expired license with < 1 day grace period', + valid_key: true, + time_remaining: 0, + grace_period_remaining: 85000, + free_instances: 10, + expects: 'grace period has been exceeded' + }, { + desc: 'expired license with > 1 day grace period', + valid_key: true, + time_remaining: 0, + grace_period_remaining: (86400 * 2), + free_instances: 10, + expects: 'after 2 days' + }, { + desc: 'valid license with time remaining = 15 days', + valid_key: true, + time_remaining: (86400 * 15), + grace_period_remaining: 0, + free_instances: 10, + expects: 'license is valid' + }, { + desc: 'valid license with time remaining < 15 days', + valid_key: true, + time_remaining: (86400 * 10) , + grace_period_remaining: 0, + free_instances: 10, + expects: 'license has 10 days remaining' + }, { + desc: 'valid license with time remaining > 15 days and remaining hosts > 0', + valid_key: true, + time_remaining: (86400 * 20), + free_instances: 10, + grace_period_remaining: 0, + expects: 'license is valid' + }, { + desc: 'valid license with time remaining > 15 days and remaining hosts = 0', + valid_key: true, + time_remaining: (86400 * 20) , + grace_period_remaining: 0, + free_instances: 0, + expects: 'license has reached capacity' + }]; + +describe('Unit:CheckLicense', function() { beforeEach(module('Tower')); - beforeEach(inject(function($rootScope) { + /*beforeEach(inject(function($rootScope) { scope = $rootScope.$new(); - })); + }));*/ it('should contain CheckLicense service', inject(function(CheckLicense) { expect(CheckLicense).not.toBe(null); @@ -25,4 +69,34 @@ describe('Unit:CheckLicense', function() { expect(CheckLicense.getRemainingDays).not.toBe(null); })); + it('should have a getHTML method', inject(function(CheckLicense) { + expect(CheckLicense.getHTML).not.toBe(null); + })); + + it('should have a getAdmin method', inject(function(CheckLicense) { + expect(CheckLicense.getAdmin).not.toBe(null); + })); + + licenses.forEach(function(lic) { + it(lic.desc, inject(function(CheckLicense) { + var r = new RegExp(lic.expects); + expect(CheckLicense.getHTML(lic).body).toMatch(r); + })); + }); + + it('should recognize empty license as invalid', inject(function(CheckLicense) { + expect(CheckLicense.getHTML({}).title).toMatch(/license required/i); + })); + + it('should show license update form to admin users when license is invalid', inject(function(CheckLicense, $rootScope) { + $rootScope.current_user = {}; + $rootScope.current_user.is_superuser = true; + expect(CheckLicense.getHTML({}).body).toMatch(/license\_license\_json/); + })); + + it('should not show license update form to non-admin users when license is invalid', inject(function(CheckLicense, $rootScope) { + $rootScope.current_user = {}; + $rootScope.current_user.is_superuser = false; + expect(CheckLicense.getHTML({}).body).not.toMatch(/license\_license\_json/); + })); });