diff --git a/apps/steward-app/src/main/js/app/client/common/common.service.spec.js b/apps/steward-app/src/main/js/app/client/common/common.service.spec.js index b3192ec36..9dcb9632e 100644 --- a/apps/steward-app/src/main/js/app/client/common/common.service.spec.js +++ b/apps/steward-app/src/main/js/app/client/common/common.service.spec.js @@ -1,70 +1,70 @@ (function () { 'use strict'; describe('shrine.common CommonService tests', CommonServiceSpec); function CommonServiceSpec() { // -- vars -- // var commonService; var user = { roles: ['admin'] }; function setup() { module('shrine.common'); inject(function (CommonService) { commonService = CommonService; }); } //-- setup --/ beforeEach(setup); - // -- tests -- // + it('CommonService should exist', function () { expect(typeof (commonService)).toBe('object'); }); it('CommonService.dateService should be defined', function () { expect(typeof (commonService.dateService)).toBe('object'); }); xit('isTest should return true if url is running on test port in localhost', function () { // -- arrange -- // var testUrl = 'http://localhost:63342/shrine-steward/index.html'; // -- act --// var result = commonService.isTest(testUrl); //-- assert --// expect(result).toBe(true); }); it('hasAccess should return true if user is in list of roles', function () { // -- arrange -- // var roles = ['admin', 'role1', 'role2']; // -- act --// var result = commonService.hasAccess(user, roles); //-- assert --// expect(result).toBe(true); }); it('toBase64 should return a formatted base64 encrypted string if given a password', function () { // -- arrange -- // var password = 'password'; var expectedResult = 'cGFzc3dvcmQ='; // -- act --// var result = commonService.toBase64(password); //-- assert --// expect(result).toBe(expectedResult); }); } })(); diff --git a/apps/steward-app/src/main/js/app/client/common/xml.service.spec.js b/apps/steward-app/src/main/js/app/client/common/xml.service.spec.js index 719010e39..4fb2bcd9d 100644 --- a/apps/steward-app/src/main/js/app/client/common/xml.service.spec.js +++ b/apps/steward-app/src/main/js/app/client/common/xml.service.spec.js @@ -1,42 +1,41 @@ (function () { 'use strict'; describe('shrine.common XMLService tests', XMLServieSpec); function XMLServieSpec() { // -- vars -- // var xmlService; function setup() { module('shrine.common'); inject(function (XMLService) { xmlService = XMLService; }); } // -- setup -- // beforeEach(setup); - // -- tests -- // it('CommonService should exist', function () { expect(typeof (xmlService)).toBe('object'); }); it('xmlStringToJson should convert an simple xml string to json', function () { // -- arrange -- // var xmlString = '<person><name>Test</name></person>'; var expectedResult = { person: { name: 'Test' } }; // -- act -- // var result = xmlService.xmlStringToJson(xmlString); // -- assert --// expect(result.name).toBe(expectedResult.name); }) } })(); \ No newline at end of file diff --git a/apps/steward-app/src/main/js/app/client/login/login.controller.js b/apps/steward-app/src/main/js/app/client/login/login.controller.js index e396516e6..f5f38e91a 100644 --- a/apps/steward-app/src/main/js/app/client/login/login.controller.js +++ b/apps/steward-app/src/main/js/app/client/login/login.controller.js @@ -1,34 +1,35 @@ (function () { 'use strict'; angular - .module('shrine.steward.login'); + .module('shrine.steward.login') + .controller('LoginController', LoginController); LoginController.$inject = ['LoginModel', 'LoginService', '$location', 'constants']; function LoginController(loginModel, loginService, $location, constants) { // -- public --// var login = this; login.loginFail = false; this.checkLogin = checkLogin; - this.navigateToHome = navigateToHome; // -- private -- // function checkLogin() { loginService.setAuthHeader(login.username, login.password); - loginService.login() + loginModel.login() .then(navigateToHome, setLoginToError); } function navigateToHome(response) { loginService.setCredentials(login.username, login.password, response.roles); $location.path(constants.homeRoute); } function setLoginToError(response) { loginService.clearCredentials(); login.loginFail = true; login.username = login.password = ''; + login.status = response.message; } } })(); diff --git a/apps/steward-app/src/main/js/app/client/login/login.model.js b/apps/steward-app/src/main/js/app/client/login/login.model.js index 3c75f6b72..514b02a3b 100644 --- a/apps/steward-app/src/main/js/app/client/login/login.model.js +++ b/apps/steward-app/src/main/js/app/client/login/login.model.js @@ -1,50 +1,48 @@ (function () { 'use strict'; angular .module('shrine.steward.login') - .factory('loginModel', LoginModel); + .factory('LoginModel', LoginModel); LoginModel.$inject = ['$http', '$q', 'constants']; function LoginModel($http, $q, constants) { // -- private --// var loginModel = this; var authFail = 'AuthenticationFailed'; var url = constants.baseUrl + 'user/whoami/'; return { login: authenticate }; function authenticate() { return $http.get(url) .then(parse, reject); } function parse(result) { - var data = result.data; - - return (data === 'AuthenticationFailed') ? + return (result.data === 'AuthenticationFailed') ? reject(result) : { success: true, msg: result.data.statusText, userId: result.data.userId, roles: result.data.roles }; } function reject(result, msg) { - var statusText = result.data.statusText || result.data; + result.data = result.data || 'xhr request timed out'; var response = { success: false, - msg: 'invalid login ' + statusText + message: 'invalid login: ' + result.data }; return $q.reject(response); } } })(); diff --git a/apps/steward-app/src/main/js/app/client/login/login.model.spec.js b/apps/steward-app/src/main/js/app/client/login/login.model.spec.js index bc327ed54..d98f91895 100644 --- a/apps/steward-app/src/main/js/app/client/login/login.model.spec.js +++ b/apps/steward-app/src/main/js/app/client/login/login.model.spec.js @@ -1,45 +1,45 @@ (function () { 'use strict'; describe('loginModel services', LoginModelSpec); function LoginModelSpec() { var loginModel, $httpBackend, constants; function setup() { module('shrine.steward.login'); - inject(function (_$httpBackend_, _loginModel_, _constants_) { + inject(function (_$httpBackend_, _LoginModel_, _constants_) { $httpBackend = _$httpBackend_; - loginModel = _loginModel_; + loginModel = _LoginModel_; constants = _constants_; $httpBackend.whenGET(/\.html$/).respond(''); }); } beforeEach(setup); it('loginModel.bar() - test', function () { var mockData = { statusText: 'success', userId: 'test', roles: ['testRole1,testRole2,testRole3'] }; var expectedResult = { success: true, msg: 'success', userId: mockData.userId, roles: mockData.roles } $httpBackend.expectGET(constants.baseUrl + 'user/whoami/').respond(mockData); loginModel.login().then(function (data) { expect(data.userId).toEqual(mockData.userId); }); $httpBackend.flush(); }); } })(); diff --git a/apps/steward-app/src/main/js/app/client/login/login.service.spec.js b/apps/steward-app/src/main/js/app/client/login/login.service.spec.js index 9670b367b..724371326 100644 --- a/apps/steward-app/src/main/js/app/client/login/login.service.spec.js +++ b/apps/steward-app/src/main/js/app/client/login/login.service.spec.js @@ -1,76 +1,76 @@ (function () { 'use strict'; describe('shrine.steward.login LoginService tests', LoginServiceSpec); function LoginServiceSpec() { // -- vars -- // var loginService, http, stewardService; // -- arrange -- // var username = 'test'; var password = 'testpassword'; var roles = ['testRole1', 'testRole2', 'testRole3']; function setup() { module('shrine.steward.login'); inject(function (LoginService, $http, StewardService) { loginService = LoginService; http = $http; stewardService = StewardService; }); } //-- setup --/ beforeEach(setup); - // -- tests -- // + it('LoginService should exist', function () { expect(typeof (loginService)).toBe('object'); }); it('setAuthHeader should set the Authorization Header', function () { // -- arrange -- // var expectedAuthHeader = 'Basic dGVzdDp0ZXN0cGFzc3dvcmQ='; //-- act --// loginService.setAuthHeader(username, password); var result = http.defaults.headers.common['Authorization']; // -- assert --// expect(result).toEqual(expectedAuthHeader); }); it('setCredentials should set the proper user credentials', function () { // -- arrange -- // var expectedResult = { username: 'test', authdata: 'dGVzdDp0ZXN0cGFzc3dvcmQ=', isLoggedIn: true, roles: ['testRole1', 'testRole2', 'testRole3'] }; // -- act -- // loginService.setCredentials(username, password, roles); var user = stewardService.getAppUser(); // -- assert --/ expect(user).toEqual(expectedResult); }); it('clearCredentials should clear the user', function () { // -- arrange -- // var expectedResult = {}; // -- act -- // loginService.clearCredentials(); var user = stewardService.getAppUser(); // -- assert --/ expect(user).toEqual({}); }); } })(); diff --git a/apps/steward-app/src/main/js/app/client/login/login.tpl.html b/apps/steward-app/src/main/js/app/client/login/login.tpl.html index e69de29bb..a2a0b3fe5 100644 --- a/apps/steward-app/src/main/js/app/client/login/login.tpl.html +++ b/apps/steward-app/src/main/js/app/client/login/login.tpl.html @@ -0,0 +1,72 @@ + + <div class="row shrine-login"> + <div class="col-sm-4"> + <p class="shrine-copy-bold"> + </p> + + + <ul class="shrine-copy"> + + </ul> + + <p class="shrine-copy"> + </p> + + </div> + <div class="col-sm-4"> + <div class="shrine-panel"> + + <div class="panel-body"> + <form name="form" + ng-submit="login.checkLogin()" + role="form"> + + <fieldset> + <div class="form-group"> + <label class="pull-right shrine-copy-bold" + ng-show="form.username.$error.required ||form.password.$error.required"> + *<small>Required Field</small> + </label> + <span>Username*</span> + <!-- ng username --> + <input class="form-control" + type="text" + name="username" + id="username" + class="form-control" + ng-model="login.username" + autofocus required novalidate/> + </div> + + <div class="form-group"> + <span>Password*</span> + <!-- ng password --> + <input class="form-control" + type="password" + name="password" + id="password" + ng-model="login.password" + required novalidate/> + </div> + + <div class="form-group has-error" + style="text-align: center"> + <!-- ng status --> + <label ng-show="login.loginFail === true" + class="control-label" + for="inputError">{{login.status}}</label> + </div> + + <!-- ng submit --> + <div> + <button type="submit" + class="pull-right fa fa-chevron-right fa-3x shrine-button" + ng-disabled="!form.$valid"></button> + </div> + + </fieldset> + </form> + </div> + </div> + </div> + </div> diff --git a/apps/steward-app/src/main/js/app/client/steward.constants.js b/apps/steward-app/src/main/js/app/client/steward.constants.js index 9d24f553b..e4da714a9 100644 --- a/apps/steward-app/src/main/js/app/client/steward.constants.js +++ b/apps/steward-app/src/main/js/app/client/steward.constants.js @@ -1,58 +1,59 @@ (function () { 'use strict'; - var baseUrl = 'https://localhost:6443/steward/'; - var testPort = '8000'; + var server = 'http://localhost'; + var restBase = 'steward/' + var port = ':8080/'; + var baseUrl = server + port + restBase; var homeRoute = '/topics'; var defaultRoute = '/login'; var restOptions = { skip: '{$SKIP$}', limit: '{$LIMIT$}', state: '{$STATE$}', direction: '{$DIRECTION$}', sortBy: '{$SORT_BY$}', minDate: '{$MIN_DATE$}', maxDate: '{$MAX_DATE$}', }; var restInterpolators = { skip: 'skip=' + restOptions.skip, limit: 'limit=' + restOptions.limit, state: 'state=' + restOptions.state, direction: 'sortDirection=' + restOptions.direction, sortBy: 'sortBy=' + restOptions.sortBy, minDate: 'minDate=' + restOptions.minDate, maxDate: 'maxDate=' + restOptions.maxDate }; var states = { state1: 'Pending', state2: 'Approved', state3: 'Rejected' }; // -- todo: delete? var title = 'SHRINE DATA STEWARD'; var roles = { role1: 'researcher', role2: 'data-steward', role3: 'admin' }; angular .module('shrine.steward') .constant('constants', { 'homeRoute': homeRoute, 'defaultRoute': defaultRoute, 'baseUrl': baseUrl, 'restOptions': restOptions, 'restInterpolators': restInterpolators, 'states': states, 'roles': roles, - 'testPort': testPort, 'title': title//todo: delete? }); })(); diff --git a/apps/steward-app/src/main/js/app/client/steward.constants.spec.js b/apps/steward-app/src/main/js/app/client/steward.constants.spec.js index b2b074f97..7672553bf 100644 --- a/apps/steward-app/src/main/js/app/client/steward.constants.spec.js +++ b/apps/steward-app/src/main/js/app/client/steward.constants.spec.js @@ -1,66 +1,61 @@ (function () { 'use strict'; describe('shrine.steward constants tests', StewardConstantsSpec); function StewardConstantsSpec() { // -- vars -- // var stewardConstants; function setup() { module('shrine.steward'); inject(function (constants) { stewardConstants = constants; }); } //-- setup --/ beforeEach(setup); - // -- tests -- // + it('constants should exist.', function () { expect(stewardConstants).toBeDefined(); }); - // -- tests -- // + it('homeRoute member should exist.', function () { expect(stewardConstants.homeRoute).toBeDefined(); }); - // -- tests -- // + it('baseUrl member should exist.', function () { expect(stewardConstants.baseUrl).toBeDefined(); }); - // -- tests -- // + it('restOptions member should exist.', function () { expect(stewardConstants.restOptions).toBeDefined(); }); - // -- tests -- // + it('restInterpolators member should exist.', function () { expect(stewardConstants.restInterpolators).toBeDefined(); }); - // -- tests -- // + it('states member should exist.', function () { expect(stewardConstants.states).toBeDefined(); }); - // -- tests -- // + it('roles member should exist.', function () { expect(stewardConstants.roles).toBeDefined(); }); - // -- tests -- // - it('testPort member should exist.', function () { - expect(stewardConstants.testPort).toBeDefined(); - }); - - // -- tests -- // + it('title member should exist.', function () { expect(stewardConstants.title).toBeDefined(); }); } })(); diff --git a/apps/steward-app/src/main/js/app/client/steward.controller.spec.js b/apps/steward-app/src/main/js/app/client/steward.controller.spec.js index bd410c633..11a246c9f 100644 --- a/apps/steward-app/src/main/js/app/client/steward.controller.spec.js +++ b/apps/steward-app/src/main/js/app/client/steward.controller.spec.js @@ -1,30 +1,30 @@ (function () { 'use strict'; describe('shrine.steward controller tests', CommonServiceSpec); function CommonServiceSpec() { // -- vars -- // var stewardController; function setup() { module('shrine.steward'); inject(function ($controller) { stewardController = $controller('StewardController', {}); }); } //-- setup --/ beforeEach(setup); - // -- tests -- // + it('StewardController should exist', function () { expect(typeof (stewardController)).toBe('object'); }); it('Common Service should exist', function () { expect(stewardController.commonService).toBeDefined(); }) } })(); diff --git a/apps/steward-app/src/main/js/app/client/steward.module.js b/apps/steward-app/src/main/js/app/client/steward.module.js index 6279afdb1..630532fe9 100644 --- a/apps/steward-app/src/main/js/app/client/steward.module.js +++ b/apps/steward-app/src/main/js/app/client/steward.module.js @@ -1,14 +1,15 @@ (function () { 'use strict'; var dependencies = [ 'ui.router', 'ui.bootstrap', 'ui.bootstrap.modal', 'angular-loading-bar', - 'shrine.common' + 'shrine.common', + 'shrine.steward.login' ]; angular .module('shrine.steward', dependencies); })(); \ No newline at end of file diff --git a/apps/steward-app/src/main/js/app/client/steward.provider.spec.js b/apps/steward-app/src/main/js/app/client/steward.provider.spec.js index dc9703109..69860c28c 100644 --- a/apps/steward-app/src/main/js/app/client/steward.provider.spec.js +++ b/apps/steward-app/src/main/js/app/client/steward.provider.spec.js @@ -1,49 +1,49 @@ (function () { 'use strict'; describe('shrine.steward StewardProvider tests', StewardProviderSpec); function StewardProviderSpec() { // -- vars -- // var stewardProvider //http://stackoverflow.com/questions/14771810/how-to-test-angularjs-custom-provider function setup() { /** * Create a mock module and inject the provider * in order to initialize the stewardProvider. * */ angular.module('shrine.steward.mock',[]) .config(function(StewardServiceProvider) { stewardProvider = StewardServiceProvider; }); module('shrine.steward', 'shrine.steward.mock'); inject(function () { }); } //-- setup --/ beforeEach(setup); - // -- tests -- // + it('StewardProvider should exist.', function () { expect(stewardProvider).toBeDefined(); }); it('$get should yield an instance of StewardService', function () { var shrineService = stewardProvider.$get(); expect(shrineService.setAppUser).toBeDefined(); }); it('configureHttpProvider should be defined', function () { expect(stewardProvider.configureHttpProvider).toBeDefined(); }); it('constants should be defined', function () { expect(stewardProvider.constants).toBeDefined(); }); } })(); diff --git a/apps/steward-app/src/main/js/app/client/steward.route.spec.js b/apps/steward-app/src/main/js/app/client/steward.route.spec.js index 606ed50f0..7457faf57 100644 --- a/apps/steward-app/src/main/js/app/client/steward.route.spec.js +++ b/apps/steward-app/src/main/js/app/client/steward.route.spec.js @@ -1,55 +1,55 @@ (function () { 'use strict'; describe('shrine.steward.route tests', StewardRouteSpec); function StewardRouteSpec() { // -- vars -- // var $state; var $rootScope; var templateCache; var stewardService; var state = 'topics'; var user = { username: 'testUser', password: 'kapow', roles: ['testRole1','testRole2','testRole3'] }; function setup() { module('shrine.steward'); inject(function (_$state_, $templateCache, _$rootScope_, _StewardService_) { $state = _$state_ $rootScope = _$rootScope_; templateCache = $templateCache; stewardService = _StewardService_; }); } function activateRoute(template, name) { templateCache.put(template, ''); $state.go(name); $rootScope.$digest(); } //-- setup --/ beforeEach(setup); - // -- tests -- // + it('topics route url should be set to #/topics', function () { stewardService.setAppUser(user.username, user.password, user.roles); activateRoute('app/client/topics/topics.tpl.html', 'topics'); expect($state.href($state.current.name)).toEqual('#/topics'); }); - // -- tests -- // + it('login route url should be set to #/login', function () { stewardService.deleteAppUser(); activateRoute('app/client/login/login.tpl.html', 'login'); expect($state.href($state.current.name)).toEqual('#/login'); }); } } )(); diff --git a/apps/steward-app/src/main/js/app/client/steward.service.js b/apps/steward-app/src/main/js/app/client/steward.service.js index b7d9ff1ee..8d4eb95d2 100644 --- a/apps/steward-app/src/main/js/app/client/steward.service.js +++ b/apps/steward-app/src/main/js/app/client/steward.service.js @@ -1,95 +1,95 @@ (function () { 'use strict'; angular .module('shrine.steward') .provider('StewardService', StewardProvider); StewardProvider.$inject = ['constants']; function StewardProvider(constants) { // -- make available to configuration --// this.$get = get; this.configureHttpProvider = configureHttpProvider; this.constants = constants; // -- provide steward service --// get.$inject = ['CommonService']; function get(CommonService) { return new StewardService(CommonService, constants); } /** * Set up cross domain voodoo, if running from deployment, No IE Cache * @param httpProvider * @returns {*} * @see: http://stackoverflow.com/questions/16098430/angular-ie-caching-issue-for-http */ function configureHttpProvider(httpProvider) { // -- set up cross domain -- // httpProvider.defaults.useXDomain = true; delete httpProvider.defaults.headers.common['X-Requested-With']; // -- If running from deployment, No IE Cache -- // - if (window.location.origin.indexOf('http://localhost:' + constants.testPort) === -1) { + if (window.location.origin.indexOf('http://localhost:') === -1) { //initialize get if not there if (!httpProvider.defaults.headers.get) { httpProvider.defaults.headers.get = {}; } //disable IE ajax request caching httpProvider.defaults.headers.get['If-Modified-Since'] = 'Sat, 26 Jul 1997 05:00:00 GMT'; httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache'; httpProvider.defaults.headers.get['Pragma'] = 'no-cache'; } return httpProvider; } } /** * Steward Servcice. */ function StewardService(CommonService, constants) { // -- private vars -- // var appTitle = null; var appUser = null; // -- public members -- // this.commonService = CommonService; this.constants = constants; // -- public methods -- // this.setAppUser = setAppUser; this.getAppUser = getAppUser; this.deleteAppUser = deleteAppUser; /** * -- set app user. -- */ function setAppUser(username, authdata, roles) { appUser = { username: username, authdata: authdata, isLoggedIn: true, roles: roles }; } /** * -- read only -- */ function getAppUser() { return angular.extend({}, appUser); } /** * -- delete user -- */ function deleteAppUser() { appUser = null; } } })(); diff --git a/apps/steward-app/src/main/js/app/client/steward.service.spec.js b/apps/steward-app/src/main/js/app/client/steward.service.spec.js index 6186677bb..9aef8444d 100644 --- a/apps/steward-app/src/main/js/app/client/steward.service.spec.js +++ b/apps/steward-app/src/main/js/app/client/steward.service.spec.js @@ -1,52 +1,50 @@ (function () { 'use strict'; describe('shrine.steward StewardService tests', StewardServiceSpec); function StewardServiceSpec() { // -- vars -- // var stewardService function setup() { module('shrine.steward'); inject(function (StewardService) { stewardService = StewardService; }); } //-- setup --/ beforeEach(setup); - // -- tests -- // + it('commonService member should exist.', function () { expect(stewardService.commonService).toBeDefined(); }); - // -- tests -- // it('constants member should exist.', function () { expect(stewardService.constants).toBeDefined(); }); - // -- tests -- // it('setAppUser and getAppUser user should work.', function () { var username = 'ben'; var password = 'kapow'; var authData = stewardService.commonService.toBase64(username + ':' + password); var roles = ['admin','steward','researcher']; var appUser = { username: 'ben', authData: authData, isLoggedIn:true, roles: roles }; stewardService.setAppUser(username, authData, roles); var user = stewardService.getAppUser(); expect(user).toBeDefined(); }); } })(); diff --git a/apps/steward-app/src/main/js/app/client/topics/topics.controller.js b/apps/steward-app/src/main/js/app/client/topics/topics.controller.js index 979a4abf4..c7f9a76be 100644 --- a/apps/steward-app/src/main/js/app/client/topics/topics.controller.js +++ b/apps/steward-app/src/main/js/app/client/topics/topics.controller.js @@ -1,13 +1,14 @@ (function() { 'use strict'; + angular .module('shrine.steward') .controller('TopicsController', TopicsController); function TopicsController() { var topics = this; topics.message = 'TopicsController loaded'; } })(); \ No newline at end of file diff --git a/apps/steward-app/src/main/js/gulp.config.js b/apps/steward-app/src/main/js/gulp.config.js index 49ba06f3e..5eea424da 100644 --- a/apps/steward-app/src/main/js/gulp.config.js +++ b/apps/steward-app/src/main/js/gulp.config.js @@ -1,79 +1,79 @@ module.exports = function () { // -- dependencies -- // var wiredep = require('wiredep'); var bowerJS = wiredep({devDependencies:true})['js'];//grab .js dev depenencies. var bowerCSS = wiredep({devDependencies:true})['css']; // -- directories -- // var src = './app/'; var clientDir = src + 'client/'; var assets = src + 'assets/'; var build = './build/'; var lintFiles = clientDir + '**/*.js'; - var srcFiles = clientDir + '**/!(*.spec)+(.js)' + var srcFiles = clientDir + '**/!(*.spec)+(.js)'; var moduleFiles = clientDir + '**/*.module.js'; var specFiles = clientDir + '**/*.spec.js'; var config = { index: 'index.html', buildDir: build, lintFiles: lintFiles, jsFiles: [ clientDir + '**/*.module.js', lintFiles, '!' + clientDir + '**/*.spec.js' ], tplFiles: [ clientDir + '**/*.tpl.html' ], configFiles: [ src + '/config/**/*' ], cssFiles: [ assets + '**/*.css' ], assetFiles: [assets + '**/*',src + 'config/**/*'], clientDir: clientDir, bower: { json: require('./bower.json'), directory: './bower_components/', ignorePath: '../..', jsFiles: bowerJS, cssFiles: bowerCSS } }; config.getWiredepDefaultOptions = function () { var options = { bowerJson: config.bower.json, directory: config.bower.directory, ignorePath: config.bower.ignorePath }; }; config.watchFiles = config.assetFiles.concat(config.jsFiles).concat(config.tplFiles).concat(config.index); config.karma = getKarmaOptions(); return config; function getKarmaOptions () { var options = { files: config.bower.jsFiles.concat([moduleFiles, srcFiles, specFiles]), exclude: [], coverage: { reporters: [ {type: 'html', subdir: 'report-html'}, {type: 'text-summary'} //outputs to console. ] }, preprocessors: {} }; options.preprocessors[clientDir + '**/!(*.spec)+(.js)'] = ['coverage']; return options; } };