diff --git a/config/build.config.js b/config/build.config.js index 539d56ee99..74b8268156 100644 --- a/config/build.config.js +++ b/config/build.config.js @@ -5,6 +5,8 @@ module.exports = { dist: 'dist', releasePostUrl: fs.readFileSync('config/RELEASE_POST_URL'), + protractorPort: 8765, + banner: '/*!\n' + ' * Copyright 2014 Drifty Co.\n' + diff --git a/config/demos/demos.config.js b/config/demos/demos.config.js index c60e09e9e4..38a593eb93 100644 --- a/config/demos/demos.config.js +++ b/config/demos/demos.config.js @@ -7,6 +7,7 @@ var projectBase = path.resolve(__dirname, '../..'); module.exports = function(config) { config = staticSite(config); + config.set('buildConfig', require('../build.config')); config.merge('rendering.nunjucks.config.tags', { variableStart: '{$', diff --git a/config/demos/processors/demos.js b/config/demos/processors/demos.js index 257999bfdb..a0e24dcc8f 100644 --- a/config/demos/processors/demos.js +++ b/config/demos/processors/demos.js @@ -14,10 +14,22 @@ module.exports = { process: function(docs, config) { var contentsFolder = config.rendering.contentsFolder; - var assetOutputPath = path.join(contentsFolder, '${component}/${name}/${fileName}'); + var assetOutputPath = '${component}/${name}/${fileName}'; var pages = []; + var templates = { + '.scenario.js': 'scenario.template.js' + }; + var transform = { + '.scenario.js': function(doc) { + doc.url = 'http://localhost:' + config.get('buildConfig.protractorPort') + + '/' + config.versionData.current.folder + + '/' + _.template(assetOutputPath, _.assign({},doc,{fileName:''})); + return doc; + } + }; + var demos = _(docs) .filter('yaml') .groupBy(function(doc) { @@ -41,8 +53,10 @@ module.exports = { doc.contents = fragment.contents; doc.extension = doc.fileType.replace(/^\./,''); - doc.template = 'asset.contents.template', - doc.outputPath = _.template(assetOutputPath, doc); + doc.template = templates[doc.fileType] || 'asset.contents.template', + doc.outputPath = path.join(contentsFolder, _.template(assetOutputPath, doc)); + + doc = (transform[doc.fileType] || _.identity)(doc); demoData.files.push(doc); pages.push(doc); @@ -50,19 +64,29 @@ module.exports = { var firstDoc = demoData.files[0]; - var indexOutputPath = _.template(assetOutputPath, _.assign({}, firstDoc, { - fileName: 'index.html' - })); - var appOutputPath = _.template(assetOutputPath, _.assign({}, firstDoc, { - fileName: 'index-ionic-demo-app.js' - }, demoData)); + var indexOutputPath = path.join( + contentsFolder, + _.template(assetOutputPath, _.assign({}, firstDoc, { + fileName: 'index.html' + })) + ); + var appOutputPath = path.join( + contentsFolder, + _.template(assetOutputPath, _.assign({}, firstDoc, { + fileName: 'index-ionic-demo-app.js' + }, demoData)) + ); demoData.files = _.groupBy(demoData.files, 'extension'); demoData.id = firstDoc.id; demoData.name = firstDoc.name; demoData.component = firstDoc.component; - demoData.href = '/' + _.template(assetOutputPath, _.assign({}, firstDoc, { fileName: '' })); + demoData.href = path.join( + '/', + contentsFolder, + _.template(assetOutputPath, _.assign({}, firstDoc, { fileName: '' })) + ); pages.push({ template: 'index.template.html', diff --git a/config/demos/static-site/file-readers/yaml.js b/config/demos/static-site/file-readers/yaml.js index 895ac00c8c..3ee71275f0 100644 --- a/config/demos/static-site/file-readers/yaml.js +++ b/config/demos/static-site/file-readers/yaml.js @@ -1,9 +1,11 @@ var jsYaml = require('js-yaml'); var path = require('canonical-path'); + var YAML_LINE_REGEX = /---+/; +var FILE_PATTERN_REGEX = /\.(scenario.js|js|html|css)$/; module.exports = { - pattern: /\.*$/, + pattern: FILE_PATTERN_REGEX, processFile: function(filePath, contents, basePath) { contents = contents.trim(); @@ -26,7 +28,7 @@ module.exports = { var yamlJson = jsYaml.safeLoad(yamlContents); return [{ - fileType: path.extname(filePath), + fileType: filePath.match(FILE_PATTERN_REGEX)[0].toString(), file: filePath, basePath: basePath, contents: contents, diff --git a/config/demos/templates/scenario.template.js b/config/demos/templates/scenario.template.js new file mode 100644 index 0000000000..7731dd9565 --- /dev/null +++ b/config/demos/templates/scenario.template.js @@ -0,0 +1,9 @@ +describe('{$ doc.id $}', function() { + +it('should init', function() { + browser.get('{$ doc.url $}'); +}); + +{$ doc.contents $} + +}); diff --git a/config/gulp-tasks/test.js b/config/gulp-tasks/test.js new file mode 100644 index 0000000000..d8fff5b273 --- /dev/null +++ b/config/gulp-tasks/test.js @@ -0,0 +1,87 @@ +var cp = require('child_process'); +var connect = require('connect'); +var http = require('http'); +var buildConfig = require('../build.config'); +var karma = require('karma').server; + +var karmaConf = require('../karma.conf.js'); +var karmaSauceConf = require('../karma-sauce.conf.js'); + +module.exports = function(gulp, argv) { + + /* + * Connect to Saucelabs + */ + var sauceInstance; + gulp.task('sauce-connect', function(done) { + require('sauce-connect-launcher')({ + username: process.env.SAUCE_USER, + accessKey: process.env.SAUCE_KEY, + verbose: true, + tunnelIdentifier: process.env.TRAVIS_BUILD_NUMBER + }, function(err, instance) { + if (err) return done('Failed to launch sauce connect!'); + sauceInstance = instance; + done(); + }); + }); + + gulp.task('sauce-disconnect', function(done) { + sauceInstance && sauceInstance.close(done) || done(); + }); + + + /* + * Karma + */ + gulp.task('karma', function(done) { + karmaConf.singleRun = true; + argv.browsers && (karmaConf.browsers = argv.browsers.trim().split(',')); + argv.reporters && (karmaConf.reporters = argv.reporters.trim().split(',')); + + karma.start(karmaConf, done); + }); + + gulp.task('karma-watch', function(done) { + karmaConf.singleRun = false; + + karma.start(karmaConf, done); + }); + + gulp.task('karma-sauce', ['sauce-connect'], function(done) { + return karma.start(karmaSauceConf, function() { + sauceDisconnect(done); + }); + }); + + + /* + * Protractor Snapshot Tests + */ + var connectServer; + gulp.task('snapshot-server', function() { + var app = connect().use(connect.static(__dirname + '/../../dist/ionic-demo')); + connectServer = http.createServer(app).listen(buildConfig.protractorPort); + }); + + gulp.task('snapshot', ['snapshot-server'], function(done) { + var uuid = require('node-uuid'); + return protractor(done, [ + 'config/protractor.conf.js', + '--test_id=' + uuid.v4() + ]); + }); + + gulp.task('snapshot-sauce', ['sauce-connect', 'snapshot-server'], function(done) { + return protractor(done, ['config/protractor-sauce.conf.js']); + }); + + function protractor(done, args) { + cp.spawn('protractor', args, { stdio: 'inherit' }) + .on('exit', function(code) { + connectServer && connectServer.close(); + if (code) return done('Protector test(s) failed. Exit code: ' + code); + done(); + }); + } +}; diff --git a/config/karma-sauce.conf.js b/config/karma-sauce.conf.js index b4dea1eace..f07e7ae09c 100644 --- a/config/karma-sauce.conf.js +++ b/config/karma-sauce.conf.js @@ -1,7 +1,7 @@ var _ = require('lodash'); var shared = require('./karma.conf.js'); -module.exports = _.assign(shared, { +module.exports = _.assign({}, shared, { reporters: ['dots'], sauceLabs: { testName: 'Ionic unit tests', diff --git a/config/protractor.conf.js b/config/protractor.conf.js index d4716b67b2..81952e546d 100644 --- a/config/protractor.conf.js +++ b/config/protractor.conf.js @@ -1,9 +1,10 @@ +var buildConfig = require('./build.config'); // An example configuration file. exports.config = { // Spec patterns are relative to the location of the spec file. They may // include glob patterns. - specs: ['../test/e2e/**/*.js'], + specs: ['../dist/ionic-demo/nightly/**/*.scenario.js'], // Options to be passed to Jasmine-node. jasmineNodeOpts: { @@ -11,7 +12,7 @@ exports.config = { defaultTimeoutInterval: 120000 }, - baseUrl: 'http://localhost:8765', + baseUrl: 'http://localhost:' + buildConfig.protractorPort, //local build: chrome chromeOnly: true, diff --git a/demos/directive/checkbox/simple/simple.html b/demos/directive/checkbox/simple/index.html similarity index 100% rename from demos/directive/checkbox/simple/simple.html rename to demos/directive/checkbox/simple/index.html diff --git a/demos/directive/checkbox/simple/simple.js b/demos/directive/checkbox/simple/index.js similarity index 100% rename from demos/directive/checkbox/simple/simple.js rename to demos/directive/checkbox/simple/index.js diff --git a/demos/directive/checkbox/simple/test.scenario.js b/demos/directive/checkbox/simple/test.scenario.js new file mode 100644 index 0000000000..39b4824792 --- /dev/null +++ b/demos/directive/checkbox/simple/test.scenario.js @@ -0,0 +1,16 @@ +--- +name: simple +component: ionCheckbox +--- + +it('should uncheck 1st and check 2nd checkbox by clicking its label', function(){ + var ele = element.all(by.css('label.item-checkbox')); + ele.get(0).click(); + ele.get(1).click(); +}); + +it('should check 1st and uncheck 2nd checkbox by clicking its label', function(){ + var ele = element.all(by.css('label.item-checkbox')); + ele.get(0).click(); + ele.get(1).click(); +}); diff --git a/demos/directive/collectionRepeat/contacts/test.scenario.js b/demos/directive/collectionRepeat/contacts/test.scenario.js new file mode 100644 index 0000000000..c63d0a3f3e --- /dev/null +++ b/demos/directive/collectionRepeat/contacts/test.scenario.js @@ -0,0 +1,23 @@ +--- +name: contacts +component: collectionRepeat +--- +it('should scroll to the bottom', function(){ + var ele = element(by.css('.bar-header .button')); + ele.click(); +}); + +it('should scroll to the top', function(){ + var ele = element(by.css('.bar-header')); + ele.click(); +}); + +it('should filter by juan', function(){ + var ele = element(by.model('search')); + ele.sendKeys('juan'); +}); + +it('should clear search', function(){ + var ele = element(by.css('.bar-header .input-button')); + ele.click(); +}); diff --git a/demos/directive/footer/simple/test.scenario.js b/demos/directive/footer/simple/test.scenario.js new file mode 100644 index 0000000000..b6c5ead85b --- /dev/null +++ b/demos/directive/footer/simple/test.scenario.js @@ -0,0 +1,24 @@ +--- +name: simple +component: ionFooterBar +--- + +it('should show subfooter', function(){ + var ele = element.all(by.css('.toggle')); + ele.get(0).click(); +}); + +it('should hide subfooter', function(){ + var ele = element.all(by.css('.toggle')); + ele.get(0).click(); +}); + +it('should hide footer', function(){ + var ele = element.all(by.css('.toggle')); + ele.get(1).click(); +}); + +it('should show footer', function(){ + var ele = element.all(by.css('.toggle')); + ele.get(1).click(); +}); diff --git a/demos/directive/header/simple/test.scenario.js b/demos/directive/header/simple/test.scenario.js new file mode 100644 index 0000000000..8f114889aa --- /dev/null +++ b/demos/directive/header/simple/test.scenario.js @@ -0,0 +1,24 @@ +--- +name: simple +component: ionHeaderBar +--- + +it('should show subheader', function(){ + var ele = element.all(by.css('.toggle')); + ele.get(0).click(); +}); + +it('should hide subheader', function(){ + var ele = element.all(by.css('.toggle')); + ele.get(0).click(); +}); + +it('should hide header', function(){ + var ele = element.all(by.css('.toggle')); + ele.get(1).click(); +}); + +it('should show header', function(){ + var ele = element.all(by.css('.toggle')); + ele.get(1).click(); +}); diff --git a/demos/directive/infiniteScroll/forever/test.scenario.js b/demos/directive/infiniteScroll/forever/test.scenario.js new file mode 100644 index 0000000000..ea0e37ffdb --- /dev/null +++ b/demos/directive/infiniteScroll/forever/test.scenario.js @@ -0,0 +1,4 @@ +--- +name: forever +component: ionInfiniteScroll +--- diff --git a/demos/directive/list/animated/test.scenario.js b/demos/directive/list/animated/test.scenario.js new file mode 100644 index 0000000000..574d72dc77 --- /dev/null +++ b/demos/directive/list/animated/test.scenario.js @@ -0,0 +1,14 @@ +--- +name: animated +component: ionList +--- + +it('should add item below Item 0', function(){ + var ele = element.all(by.css('.list .button')); + ele.get(0).click(); +}); + +it('should remove Item 0', function(){ + var ele = element.all(by.css('.list .button')); + ele.get(1).click(); +}); diff --git a/demos/directive/list/reorderDelete/test.scenario.js b/demos/directive/list/reorderDelete/test.scenario.js new file mode 100644 index 0000000000..6c883ef5c0 --- /dev/null +++ b/demos/directive/list/reorderDelete/test.scenario.js @@ -0,0 +1,24 @@ +--- +name: reorderDelete +component: ionList +--- + +it('should show reorder icons', function(){ + var ele = element.all(by.css('.bar-header .button')); + ele.get(1).click(); +}); + +it('should hide reorder icons', function(){ + var ele = element.all(by.css('.bar-header .button')); + ele.get(1).click(); +}); + +it('should show delete icons', function(){ + var ele = element.all(by.css('.bar-header .button')); + ele.get(0).click(); +}); + +it('should hide delete icons', function(){ + var ele = element.all(by.css('.bar-header .button')); + ele.get(0).click(); +}); diff --git a/demos/directive/radio/chooseOne/test.scenario.js b/demos/directive/radio/chooseOne/test.scenario.js new file mode 100644 index 0000000000..8aab8ab0e0 --- /dev/null +++ b/demos/directive/radio/chooseOne/test.scenario.js @@ -0,0 +1,4 @@ +--- +name: chooseOne +component: ionRadio +--- diff --git a/demos/directive/refresher/index.html b/demos/directive/refresher/refreshList/index.html similarity index 100% rename from demos/directive/refresher/index.html rename to demos/directive/refresher/refreshList/index.html diff --git a/demos/directive/refresher/index.js b/demos/directive/refresher/refreshList/index.js similarity index 100% rename from demos/directive/refresher/index.js rename to demos/directive/refresher/refreshList/index.js diff --git a/demos/directive/refresher/refreshList/test.scenario.js b/demos/directive/refresher/refreshList/test.scenario.js new file mode 100644 index 0000000000..eef2cc669f --- /dev/null +++ b/demos/directive/refresher/refreshList/test.scenario.js @@ -0,0 +1,4 @@ +--- +name: refreshList +component: ionRefresher +--- diff --git a/demos/directive/sideMenus/navWithMenu/test.scenario.js b/demos/directive/sideMenus/navWithMenu/test.scenario.js new file mode 100644 index 0000000000..463129d682 --- /dev/null +++ b/demos/directive/sideMenus/navWithMenu/test.scenario.js @@ -0,0 +1,24 @@ +--- +name: navWithMenu +component: ionSideMenus +--- + +it('should nav to Search from left menu', function(){ + var ele = element.all(by.css('button[menu-toggle="left"]')); + ele.get(0).click(); + + browser.sleep(500).then(function(){ + var itemEle = element.all(by.css('ion-side-menu[side="left"] a')); + itemEle.get(0).click(); + }); +}); + +it('should nav to Browse from left menu', function(){ + var ele = element.all(by.css('button[menu-toggle="left"]')); + ele.get(0).click(); + + browser.sleep(500).then(function(){ + var itemEle = element.all(by.css('ion-side-menu[side="left"] a')); + itemEle.get(1).click(); + }); +}); diff --git a/demos/directive/sideMenus/simple/test.scenario.js b/demos/directive/sideMenus/simple/test.scenario.js new file mode 100644 index 0000000000..3f0afd44de --- /dev/null +++ b/demos/directive/sideMenus/simple/test.scenario.js @@ -0,0 +1,23 @@ +--- +name: simple +component: ionSideMenus +--- +it('should show left menu', function(){ + var ele = element.all(by.css('.bar-header .button')); + ele.get(0).click(); +}); + +it('should hide left menu by clicking header button', function(){ + var ele = element.all(by.css('.bar-header .button')); + ele.get(0).click(); +}); + +it('should show left menu', function(){ + var ele = element.all(by.css('.bar-header .button')); + ele.get(0).click(); +}); + +it('should hide left menu by close menu item', function(){ + var ele = element.all(by.css('ion-side-menu[side="left"] a')); + ele.get(0).click(); +}); diff --git a/demos/directive/slideBox/appIntro/test.scenario.js b/demos/directive/slideBox/appIntro/test.scenario.js new file mode 100644 index 0000000000..f91bbff176 --- /dev/null +++ b/demos/directive/slideBox/appIntro/test.scenario.js @@ -0,0 +1,33 @@ +--- +name: appIntro +component: ionSlideBox +--- +it('should go to slide 2', function(){ + var ele = element(by.css('.right-buttons .button')); + ele.click(); +}); + +it('should go to slide 1', function(){ + var ele = element(by.css('.left-buttons .button')); + ele.click(); +}); + +it('should go to slide 2', function(){ + var ele = element(by.css('.right-buttons .button')); + ele.click(); +}); + +it('should go to slide 3', function(){ + var ele = element(by.css('.right-buttons .button')); + ele.click(); +}); + +it('should go to main app', function(){ + var ele = element(by.css('.right-buttons .button')); + ele.click(); +}); + +it('should start over', function(){ + var ele = element(by.css('ion-nav-view .button')); + ele.click(); +}); diff --git a/demos/directive/tabs/tabsAndNav/test.scenario.js b/demos/directive/tabs/tabsAndNav/test.scenario.js new file mode 100644 index 0000000000..f49c1e8841 --- /dev/null +++ b/demos/directive/tabs/tabsAndNav/test.scenario.js @@ -0,0 +1,63 @@ +--- +name: tabsAndNav +component: ionTabs +--- +it('should go to page 2 in Home tab', function(){ + var ele = element.all(by.css('ion-nav-view[name="home-tab"] .button')); + ele.get(0).click(); +}); + +it('should go to page 3 in Home tab', function(){ + var ele = element.all(by.css('ion-nav-view[name="home-tab"] .button')); + ele.get(1).click(); +}); + +it('should go to About tab', function(){ + var ele = element.all(by.css('.tabs a')); + ele.get(1).click(); +}); + +it('should go to page 2 in About tab', function(){ + var ele = element.all(by.css('ion-nav-view[name="about-tab"] .button')); + ele.get(0).click(); +}); + +it('should go to Contact tab', function(){ + var ele = element.all(by.css('.tabs a')); + ele.get(2).click(); +}); + +it('should go to About tab and still be at page 2', function(){ + var ele = element.all(by.css('.tabs a')); + ele.get(1).click(); +}); + +it('should go to Home tab and still be at page 3', function(){ + var ele = element.all(by.css('.tabs a')); + ele.get(0).click(); +}); + +it('should go back to page 2 in Home tab', function(){ + var ele = element(by.css('ion-nav-back-button')); + ele.click(); +}); + +it('should go back to page 1 in Home tab', function(){ + var ele = element(by.css('ion-nav-back-button')); + ele.click(); +}); + +it('should go to About tab and still be at page 2', function(){ + var ele = element.all(by.css('.tabs a')); + ele.get(1).click(); +}); + +it('should go back to page 1 in About tab', function(){ + var ele = element(by.css('ion-nav-back-button')); + ele.click(); +}); + +it('should go to Home tab and still be at page 1', function(){ + var ele = element.all(by.css('.tabs a')); + ele.get(0).click(); +}); diff --git a/demos/service/actionSheet/test.scenario.js b/demos/service/actionSheet/test.scenario.js new file mode 100644 index 0000000000..a04a13bfb5 --- /dev/null +++ b/demos/service/actionSheet/test.scenario.js @@ -0,0 +1,24 @@ +--- +name: takeAction +component: $ionicActionSheet +--- + +it('should open up actionsheet', function(){ + var ele = element(by.css('.button')); + ele.click(); +}); + +it('should close when clicking backdrop', function(){ + var ele = element(by.css('.action-sheet-backdrop')); + ele.click(); +}); + +it('should open up actionsheet again', function(){ + var ele = element(by.css('.button')); + ele.click(); +}); + +it('should click the share button', function(){ + var ele = element.all(by.css('.action-sheet-group .button')); + ele.get(0).click(); +}); diff --git a/demos/service/loading/test.scenario.js b/demos/service/loading/test.scenario.js new file mode 100644 index 0000000000..7823211830 --- /dev/null +++ b/demos/service/loading/test.scenario.js @@ -0,0 +1,4 @@ +--- +name: complete +component: $ionicLoading +--- diff --git a/demos/service/popup/popping/test.scenario.js b/demos/service/popup/popping/test.scenario.js new file mode 100644 index 0000000000..e1c89956e5 --- /dev/null +++ b/demos/service/popup/popping/test.scenario.js @@ -0,0 +1,36 @@ +--- +name: popping +component: $ionicPopup +--- + +it('should open confirm popup', function(){ + var ele = element.all(by.css('[ng-click="showConfirm()"]')); + ele.get(0).click(); +}); + +it('should cancel confirm popup', function(){ + var ele = element.all(by.css('.popup-buttons .button')); + ele.get(0).click(); +}); + +it('should open prompt popup and enter input', function(){ + var ele = element.all(by.css('[ng-click="showPrompt()"]')); + ele.get(0).click(); + ele = element(by.model('data.response')); + ele.sendKeys('Waffles'); +}); + +it('should close prompt popup by clicking OK', function(){ + var ele = element.all(by.css('.popup-buttons .button')); + ele.get(1).click(); +}); + +it('should open alert popup', function(){ + var ele = element.all(by.css('[ng-click="showAlert()"]')); + ele.get(0).click(); +}); + +it('should close alert popup', function(){ + var ele = element.all(by.css('.popup-buttons .button')); + ele.get(0).click(); +}); diff --git a/gulpfile.js b/gulpfile.js index eec50900fa..4376fd2f49 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,5 +1,4 @@ var gulp = require('gulp'); -var karma = require('karma').server; var path = require('canonical-path'); var pkg = require('./package.json'); var semver = require('semver'); @@ -10,7 +9,6 @@ var argv = require('minimist')(process.argv.slice(2)); var _ = require('lodash'); var buildConfig = require('./config/build.config.js'); var changelog = require('conventional-changelog'); -var connect = require('connect'); var dgeni = require('dgeni'); var es = require('event-stream'); var htmlparser = require('htmlparser2'); @@ -21,7 +19,6 @@ var mkdirp = require('mkdirp'); var twitter = require('node-twitter-api'); var yaml = require('js-yaml'); -var http = require('http'); var cp = require('child_process'); var fs = require('fs'); @@ -48,6 +45,11 @@ if (IS_RELEASE_BUILD) { ); } +/** + * Load Test Tasks + */ +require('./config/gulp-tasks/test')(gulp, argv); + if (argv.dist) { buildConfig.dist = argv.dist; } @@ -406,79 +408,6 @@ gulp.task('docs-index', function() { }); }); -gulp.task('sauce-connect', sauceConnect); - -gulp.task('cloudtest', ['protractor-sauce'], function(cb) { - sauceDisconnect(cb); -}); - -gulp.task('karma', function(cb) { - var config = require('./config/karma.conf.js'); - config.singleRun = true; - if (argv.browsers) { - config.browsers = argv.browsers.trim().split(','); - } - if (argv.reporters) { - config.reporters = argv.reporters.trim().split(','); - } - return karma.start(config, cb); -}); -gulp.task('karma-watch', function(cb) { - return karma.start(_.assign(require('./config/karma.conf.js'), {singleRun: false}), cb); -}); -gulp.task('karma-sauce', ['sauce-connect'], function(cb) { - return karma.start(require('./config/karma-sauce.conf.js'), function() { - sauceDisconnect(cb); - }); -}); - -var connectServer; -gulp.task('connect-server', function() { - var app = connect().use(connect.static(__dirname)); - connectServer = http.createServer(app).listen(8765); -}); -gulp.task('protractor', ['connect-server'], function(cb) { - return protractor(cb, ['config/protractor.conf.js']); -}); -gulp.task('protractor-sauce', ['sauce-connect', 'connect-server'], function(cb) { - return protractor(cb, ['config/protractor-sauce.conf.js']); -}); - -function pad(n) { - if (n<10) { return '0' + n; } - return n; -} - -function protractor(cb, args) { - cp.spawn('protractor', args, { stdio: 'inherit' }) - .on('exit', function(code) { - connectServer && connectServer.close(); - if (code) return cb('Protector test(s) failed. Exit code: ' + code); - cb(); - }); -} - -var sauceInstance; -function sauceConnect(cb) { - require('sauce-connect-launcher')({ - username: process.env.SAUCE_USER, - accessKey: process.env.SAUCE_KEY, - verbose: true, - tunnelIdentifier: process.env.TRAVIS_BUILD_NUMBER - }, function(err, instance) { - if (err) return cb('Failed to launch sauce connect!'); - sauceInstance = instance; - cb(); - }); -} - -function sauceDisconnect(cb) { - if (sauceInstance) { - return sauceInstance.close(cb); - } - cb(); -} - function notContains(disallowed) { disallowed = disallowed || []; @@ -507,3 +436,7 @@ function notContains(disallowed) { return match !== null ? match.index + match[1].length : -1; } } +function pad(n) { + if (n<10) { return '0' + n; } + return n; +} diff --git a/package.json b/package.json index fe414c881a..31a0f27e8f 100644 --- a/package.json +++ b/package.json @@ -45,9 +45,7 @@ "node-twitter-api": "^1.2.2", "chalk": "^0.4.0", "jshint-summary": "^0.3.0", - "js-yaml": "^3.0.2", "jasmine-node": "^1.14.3", - "q": "^1.0.1", "cpr": "^0.2.0", "dgeni": "^0.3.0", "dgeni-packages": "^0.9.3", diff --git a/test/e2e/viewState/test.html b/test/e2e/viewState/test.html deleted file mode 100644 index 63a45f907a..0000000000 --- a/test/e2e/viewState/test.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - - navViews and ion-tabs w/ nested navViews - - - - - - - - - - - -
- - - Back - - - -
- - - - - - - - - - - - - - - - - - - - diff --git a/test/e2e/viewState/test.js b/test/e2e/viewState/test.js deleted file mode 100644 index 024d8a1ed0..0000000000 --- a/test/e2e/viewState/test.js +++ /dev/null @@ -1,100 +0,0 @@ -describe('viewState', function() { - beforeEach(function() { - browser.get('http://localhost:8765/test/e2e/viewState/test.html'); - }); - - function navTitle() { - return element(by.css('h1.title')); - } - function navButtons(dir) { - return dir == 'back' ? - element(by.css('.bar-header .back-button')) : - element(by.css('.bar-header .'+dir+'-buttons .button')); - } - - it('navbar with multiple histories', function() { - expect(navTitle().getText()).toBe('Sign-In'); - expect(navButtons('back').getAttribute('class')).toContain('hide'); - expect(navButtons('left').getText()).toEqual('Home'); - expect(navButtons('left').getAttribute('class')).toContain('ion-home'); - expect(navButtons('right').getText()).toEqual(''); - expect(navButtons('right').getAttribute('class')).toContain('ion-navicon'); - - browser.takeScreenshot().then(function(png) { - console.log(png); - }); - - - element(by.id('sign-in-button')).click(); - - expect(navTitle().getText()).toBe('Auto List'); - expect(navButtons('back').getAttribute('class')).toContain('hide'); - expect(navButtons('left').isPresent()).toBe(false); - expect(navButtons('right').isPresent()).toBe(false); - - element(by.css('[href="#/tabs/autos/3"]')).click(); - - expect(navTitle().getText()).toBe('Auto Details'); - expect(navButtons('back').getAttribute('class')).not.toContain('hide'); - expect(navButtons('back').getText()).toEqual('Back'); - expect(element(by.css('.back-button i')).getAttribute('class')).toContain('ion-arrow-left-c'); - expect(navButtons('left').isPresent()).toBe(false); - expect(navButtons('right').isPresent()).toBe(false); - - element(by.css('.tabs .tab-item:nth-of-type(2)')).click(); - - expect(navTitle().getText()).toBe('Add Auto'); - expect(navButtons('back').getAttribute('class')).toContain('hide'); - expect(navButtons('left').isPresent()).toBe(false); - expect(navButtons('right').isPresent()).toBe(false); - - element(by.css('.tabs .tab-item:nth-of-type(1)')).click(); - - expect(navTitle().getText()).toBe('Auto Details'); - expect(navButtons('back').getAttribute('class')).not.toContain('hide'); - expect(navButtons('left').isPresent()).toBe(false); - expect(navButtons('right').isPresent()).toBe(false); - - navButtons('back').click(); - - expect(navTitle().getText()).toBe('Auto List'); - expect(navButtons('back').getAttribute('class')).toContain('hide'); - expect(navButtons('left').isPresent()).toBe(false); - expect(navButtons('right').isPresent()).toBe(false); - - element(by.css('[href="#/tabs/autos/3"]')).click(); - - expect(navTitle().getText()).toBe('Auto Details'); - expect(navButtons('back').getAttribute('class')).not.toContain('hide'); - expect(navButtons('left').isPresent()).toBe(false); - expect(navButtons('right').isPresent()).toBe(false); - - element(by.css('.tabs a:nth-of-type(1)')).click(); - - expect(navTitle().getText()).toBe('Auto List'); - expect(navButtons('back').getAttribute('class')).toContain('hide'); - expect(navButtons('left').isPresent()).toBe(false); - expect(navButtons('right').isPresent()).toBe(false); - - element(by.css('[href="#/tabs/autos/3"]')).click(); - - expect(navTitle().getText()).toBe('Auto Details'); - expect(navButtons('back').getAttribute('class')).not.toContain('hide'); - expect(navButtons('left').isPresent()).toBe(false); - expect(navButtons('right').isPresent()).toBe(false); - - element(by.css('.tabs a:nth-of-type(4)')).click(); - - expect(navTitle().getText()).toBe('Sign-In'); - expect(navButtons('back').getAttribute('class')).toContain('hide'); - expect(navButtons('left').getText()).toEqual('Home'); - expect(navButtons('left').getAttribute('class')).toContain('ion-home'); - expect(navButtons('right').getText()).toEqual(''); - expect(navButtons('right').getAttribute('class')).toContain('ion-navicon'); - - element(by.id('sign-in-button')).click(); - - expect(navTitle().getText()).toBe('Auto List'); - expect(navButtons('back').getAttribute('class')).toContain('hide'); - }); -});