Update gulpfile and project to add a tsconfig to protractor test folders Change all sample e2e-spec.js -> e2e-spec.ts Split typings between e2e-spec & app code Use same config for all e2e tests Only 1/3 e2e specs truly converted. Most don't pass because they fail TS transpile by Protractor due to missing type annotations
		
			
				
	
	
		
			211 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// FIRST TIME ONLY- run:
 | 
						|
//   ./node_modules/.bin/webdriver-manager update
 | 
						|
//
 | 
						|
//   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`
 | 
						|
 | 
						|
var fs = require('fs');
 | 
						|
var path = require('canonical-path');
 | 
						|
var _ = require('lodash');
 | 
						|
 | 
						|
 | 
						|
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,
 | 
						|
 | 
						|
  // Base URL for application server
 | 
						|
  baseUrl: 'http://localhost:8080',
 | 
						|
 | 
						|
  // doesn't seem to work.
 | 
						|
  // resultJsonOutputFile: "foo.json",
 | 
						|
 | 
						|
  onPrepare: function() {
 | 
						|
    //// SpecReporter
 | 
						|
    //var SpecReporter = require('jasmine-spec-reporter');
 | 
						|
    //jasmine.getEnv().addReporter(new SpecReporter({displayStacktrace: 'none'}));
 | 
						|
    //// jasmine.getEnv().addReporter(new SpecReporter({displayStacktrace: 'all'}));
 | 
						|
 | 
						|
    // debugging
 | 
						|
    // console.log('browser.params:' + JSON.stringify(browser.params));
 | 
						|
 | 
						|
    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;
 | 
						|
    global.sendKeys = sendKeys;
 | 
						|
 | 
						|
    // Allow changing bootstrap mode to NG1 for upgrade tests
 | 
						|
    global.setProtractorToNg1Mode = function() {
 | 
						|
      browser.useAllAngular2AppRoots = false;
 | 
						|
      browser.rootEl = 'body';
 | 
						|
 | 
						|
      var disableNgAnimate = function() {
 | 
						|
        angular.module('disableNgAnimate', []).run(['$animate', function($animate) {
 | 
						|
          $animate.enabled(false);
 | 
						|
        }]);
 | 
						|
      };
 | 
						|
 | 
						|
      browser.addMockModule('disableNgAnimate', disableNgAnimate);
 | 
						|
    };
 | 
						|
  },
 | 
						|
 | 
						|
  jasmineNodeOpts: {
 | 
						|
    // defaultTimeoutInterval: 60000,
 | 
						|
    defaultTimeoutInterval: 10000,
 | 
						|
    showTiming: true,
 | 
						|
    print: function() {}
 | 
						|
  },
 | 
						|
 | 
						|
  beforeLaunch: function() {
 | 
						|
    // add TS support for specs
 | 
						|
    require('ts-node').register();
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
function describeIf(cond, name, func) {
 | 
						|
  if (cond) {
 | 
						|
    describe(name, func);
 | 
						|
  } else {
 | 
						|
    xdescribe(name, func);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function itIf(cond, name, func) {
 | 
						|
  if (cond) {
 | 
						|
    it(name, func);
 | 
						|
  } else {
 | 
						|
    xit(name, func);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// Hack - because of bug with protractor send keys
 | 
						|
// Hack - because of bug with send keys
 | 
						|
function sendKeys(element, str) {
 | 
						|
  return str.split('').reduce(function (promise, char) {
 | 
						|
    return promise.then(function () {
 | 
						|
      return element.sendKeys(char);
 | 
						|
    });
 | 
						|
  }, element.getAttribute('value'));
 | 
						|
  // better to create a resolved promise here but ... don't know how with protractor;
 | 
						|
  }
 | 
						|
 | 
						|
function Reporter(options) {
 | 
						|
  var _defaultOutputFile = path.resolve(process.cwd(), "../../../../", 'protractor-results.txt');
 | 
						|
  options.outputFile = options.outputFile || _defaultOutputFile;
 | 
						|
 | 
						|
  var _root = { appDir: options.appDir, suites: [] };
 | 
						|
  log('AppDir: ' + options.appDir, +1);
 | 
						|
  var _currentSuite;
 | 
						|
 | 
						|
  this.suiteStarted = function(suite) {
 | 
						|
    _currentSuite = { description: suite.description, status: null, specs: [] };
 | 
						|
    _root.suites.push(_currentSuite);
 | 
						|
    log('Suite: ' + suite.description, +1);
 | 
						|
  };
 | 
						|
 | 
						|
  this.suiteDone = function(suite) {
 | 
						|
    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);
 | 
						|
  };
 | 
						|
 | 
						|
  this.specStarted = function(spec) {
 | 
						|
    
 | 
						|
  };
 | 
						|
 | 
						|
  this.specDone = function(spec) {
 | 
						|
    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);
 | 
						|
  };
 | 
						|
 | 
						|
  this.jasmineDone = function() {
 | 
						|
    outputFile = options.outputFile;
 | 
						|
    //// 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);
 | 
						|
  };
 | 
						|
 | 
						|
  // 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('');
 | 
						|
    });
 | 
						|
    results.push('');
 | 
						|
    return results.join('\n');
 | 
						|
  }
 | 
						|
 | 
						|
  // 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 + '  ';
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
}
 |