| 
									
										
										
										
											2016-04-14 10:36:38 -07:00
										 |  |  | // FIRST TIME ONLY- run:
 | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  | //   ./node_modules/.bin/webdriver-manager update
 | 
					
						
							| 
									
										
										
										
											2016-04-14 10:36:38 -07:00
										 |  |  | //
 | 
					
						
							|  |  |  | //   Try: `npm run webdriver:update`
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // AND THEN EVERYTIME ...
 | 
					
						
							|  |  |  | //   1. Compile with `tsc`
 | 
					
						
							|  |  |  | //   2. Make sure the test server (e.g., http-server: localhost:8080) is running.
 | 
					
						
							|  |  |  | //   3. ./node_modules/.bin/protractor protractor.config.js
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //   To do all steps, try:  `npm run e2e`
 | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | var fs = require('fs'); | 
					
						
							|  |  |  | var path = require('canonical-path'); | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  | var _ = require('lodash'); | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exports.config = { | 
					
						
							|  |  |  |   directConnect: true, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Capabilities to be passed to the webdriver instance.
 | 
					
						
							|  |  |  |   capabilities: { | 
					
						
							|  |  |  |     'browserName': 'chrome' | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Framework to use. Jasmine is recommended.
 | 
					
						
							|  |  |  |   framework: 'jasmine', | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // For angular2 tests
 | 
					
						
							|  |  |  |   useAllAngular2AppRoots: true, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 18:42:27 -07:00
										 |  |  |   // Base URL for application server
 | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   baseUrl: 'http://localhost:8080', | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // doesn't seem to work.
 | 
					
						
							|  |  |  |   // resultJsonOutputFile: "foo.json",
 | 
					
						
							| 
									
										
										
										
											2016-04-11 15:36:53 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   onPrepare: function() { | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |     //// SpecReporter
 | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |     //var SpecReporter = require('jasmine-spec-reporter');
 | 
					
						
							|  |  |  |     //jasmine.getEnv().addReporter(new SpecReporter({displayStacktrace: 'none'}));
 | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |     //// jasmine.getEnv().addReporter(new SpecReporter({displayStacktrace: 'all'}));
 | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // debugging
 | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |     // console.log('browser.params:' + JSON.stringify(browser.params));
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |     var appDir = browser.params.appDir; | 
					
						
							|  |  |  |     if (appDir) { | 
					
						
							|  |  |  |       if (appDir.match('/ts') != null) { | 
					
						
							|  |  |  |         browser.appIsTs = true; | 
					
						
							|  |  |  |       } else if (appDir.match('/js') != null) { | 
					
						
							|  |  |  |         browser.appIsJs = true; | 
					
						
							|  |  |  |       } else if (appDir.match('/dart') != null) { | 
					
						
							|  |  |  |         browser.appIsDart = true; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         browser.appIsUnknown = true; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       browser.appIsUnknown = true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     jasmine.getEnv().addReporter(new Reporter( browser.params )) ; | 
					
						
							|  |  |  |     global.describeIf = describeIf; | 
					
						
							|  |  |  |     global.itIf = itIf; | 
					
						
							| 
									
										
										
										
											2016-01-03 11:32:57 -08:00
										 |  |  |     global.sendKeys = sendKeys; | 
					
						
							| 
									
										
										
										
											2016-04-11 15:36:53 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Allow changing bootstrap mode to NG1 for upgrade tests
 | 
					
						
							|  |  |  |     global.setProtractorToNg1Mode = function() { | 
					
						
							|  |  |  |       browser.useAllAngular2AppRoots = false; | 
					
						
							|  |  |  |       browser.rootEl = 'body'; | 
					
						
							| 
									
										
										
										
											2016-05-30 11:05:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-29 00:55:38 +02:00
										 |  |  |       var disableNgAnimate = function() { | 
					
						
							|  |  |  |         angular.module('disableNgAnimate', []).run(['$animate', function($animate) { | 
					
						
							|  |  |  |           $animate.enabled(false); | 
					
						
							|  |  |  |         }]); | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       browser.addMockModule('disableNgAnimate', disableNgAnimate); | 
					
						
							| 
									
										
										
										
											2016-04-11 15:36:53 +03:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   jasmineNodeOpts: { | 
					
						
							|  |  |  |     // defaultTimeoutInterval: 60000,
 | 
					
						
							|  |  |  |     defaultTimeoutInterval: 10000, | 
					
						
							|  |  |  |     showTiming: true, | 
					
						
							|  |  |  |     print: function() {} | 
					
						
							| 
									
										
										
										
											2016-05-30 11:05:09 -07:00
										 |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   beforeLaunch: function() { | 
					
						
							|  |  |  |     // add TS support for specs
 | 
					
						
							|  |  |  |     require('ts-node').register(); | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function describeIf(cond, name, func) { | 
					
						
							|  |  |  |   if (cond) { | 
					
						
							|  |  |  |     describe(name, func); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |     xdescribe(name, func); | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function itIf(cond, name, func) { | 
					
						
							|  |  |  |   if (cond) { | 
					
						
							|  |  |  |     it(name, func); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |     xit(name, func); | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-14 10:36:38 -07:00
										 |  |  | // Hack - because of bug with protractor send keys
 | 
					
						
							| 
									
										
										
										
											2016-04-25 15:46:59 -07:00
										 |  |  | // Hack - because of bug with send keys
 | 
					
						
							| 
									
										
										
										
											2016-01-03 11:32:57 -08:00
										 |  |  | function sendKeys(element, str) { | 
					
						
							|  |  |  |   return str.split('').reduce(function (promise, char) { | 
					
						
							| 
									
										
										
										
											2016-04-25 15:46:59 -07:00
										 |  |  |     return promise.then(function () { | 
					
						
							|  |  |  |       return element.sendKeys(char); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-01-03 11:32:57 -08:00
										 |  |  |   }, element.getAttribute('value')); | 
					
						
							| 
									
										
										
										
											2016-04-25 15:46:59 -07:00
										 |  |  |   // better to create a resolved promise here but ... don't know how with protractor;
 | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | function Reporter(options) { | 
					
						
							| 
									
										
										
										
											2016-05-30 11:05:09 -07:00
										 |  |  |   var _defaultOutputFile = path.resolve(process.cwd(), "../../../../", 'protractor-results.txt'); | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |   options.outputFile = options.outputFile || _defaultOutputFile; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var _root = { appDir: options.appDir, suites: [] }; | 
					
						
							|  |  |  |   log('AppDir: ' + options.appDir, +1); | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   var _currentSuite; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   this.suiteStarted = function(suite) { | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |     _currentSuite = { description: suite.description, status: null, specs: [] }; | 
					
						
							|  |  |  |     _root.suites.push(_currentSuite); | 
					
						
							|  |  |  |     log('Suite: ' + suite.description, +1); | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   this.suiteDone = function(suite) { | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |     var statuses = _currentSuite.specs.map(function(spec) { | 
					
						
							|  |  |  |       return spec.status; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     statuses = _.uniq(statuses); | 
					
						
							|  |  |  |     var status = statuses.indexOf('failed') >= 0 ? 'failed' : statuses.join(', '); | 
					
						
							|  |  |  |     _currentSuite.status = status; | 
					
						
							|  |  |  |     log('Suite ' + _currentSuite.status + ': ' + suite.description, -1); | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   this.specStarted = function(spec) { | 
					
						
							| 
									
										
										
										
											2016-05-30 11:05:09 -07:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   this.specDone = function(spec) { | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |     var currentSpec = { | 
					
						
							|  |  |  |       description: spec.description, | 
					
						
							|  |  |  |       status: spec.status | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     if (spec.failedExpectations.length > 0) { | 
					
						
							|  |  |  |       currentSpec.failedExpectations = spec.failedExpectations; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _currentSuite.specs.push(currentSpec); | 
					
						
							|  |  |  |     log(spec.status + ' - ' + spec.description); | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   this.jasmineDone = function() { | 
					
						
							|  |  |  |     outputFile = options.outputFile; | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |     //// Alternate approach - just stringify the _root - not as pretty
 | 
					
						
							|  |  |  |     //// but might be more useful for automation.
 | 
					
						
							|  |  |  |     // var output = JSON.stringify(_root, null, 2);
 | 
					
						
							|  |  |  |     var output = formatOutput(_root); | 
					
						
							|  |  |  |     fs.appendFileSync(outputFile, output); | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |   // for output file output
 | 
					
						
							|  |  |  |   function formatOutput(output) { | 
					
						
							|  |  |  |     var indent = '  '; | 
					
						
							|  |  |  |     var pad = '  '; | 
					
						
							|  |  |  |     var results = []; | 
					
						
							|  |  |  |     results.push('AppDir:' + output.appDir); | 
					
						
							|  |  |  |     output.suites.forEach(function(suite) { | 
					
						
							|  |  |  |       results.push(pad + 'Suite: ' + suite.description + ' -- ' + suite.status); | 
					
						
							|  |  |  |       pad+=indent; | 
					
						
							|  |  |  |       suite.specs.forEach(function(spec) { | 
					
						
							|  |  |  |         results.push(pad + spec.status + ' - ' + spec.description); | 
					
						
							|  |  |  |         if (spec.failedExpectations) { | 
					
						
							|  |  |  |           pad+=indent; | 
					
						
							|  |  |  |           spec.failedExpectations.forEach(function (fe) { | 
					
						
							|  |  |  |             results.push(pad + 'message: ' + fe.message); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |           pad=pad.substr(2); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       pad = pad.substr(2); | 
					
						
							|  |  |  |       results.push(''); | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |     results.push(''); | 
					
						
							|  |  |  |     return results.join('\n'); | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  |   // for console output
 | 
					
						
							|  |  |  |   var _pad; | 
					
						
							|  |  |  |   function log(str, indent) { | 
					
						
							|  |  |  |     _pad = _pad || ''; | 
					
						
							|  |  |  |     if (indent == -1) { | 
					
						
							|  |  |  |       _pad = _pad.substr(2); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     console.log(_pad + str); | 
					
						
							|  |  |  |     if (indent == 1) { | 
					
						
							|  |  |  |       _pad = _pad + '  '; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-12-20 13:17:16 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-04 15:01:08 -08:00
										 |  |  | } |