mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-19 03:32:21 +08:00
snapshot
This commit is contained in:
17
gulpfile.js
17
gulpfile.js
@ -20,6 +20,7 @@ var sass = require('gulp-sass');
|
|||||||
var shell = require('gulp-shell');
|
var shell = require('gulp-shell');
|
||||||
var traceur = require('gulp-traceur');
|
var traceur = require('gulp-traceur');
|
||||||
var wrap = require('gulp-wrap');
|
var wrap = require('gulp-wrap');
|
||||||
|
var argv = require('yargs').argv;
|
||||||
|
|
||||||
gulp.task('default', ['js', 'html', 'sass', 'libs', 'playgroundJs', 'playgroundFiles']);
|
gulp.task('default', ['js', 'html', 'sass', 'libs', 'playgroundJs', 'playgroundFiles']);
|
||||||
|
|
||||||
@ -47,10 +48,6 @@ gulp.task('karma-watch', function() {
|
|||||||
return karma.start({ configFile: __dirname + '/scripts/test/karma-watch.conf.js' });
|
return karma.start({ configFile: __dirname + '/scripts/test/karma-watch.conf.js' });
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('sass-watch', ['sass'], function () {
|
|
||||||
gulp.watch('src/**/*.scss', ['sass']);
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('sass', function(done) {
|
gulp.task('sass', function(done) {
|
||||||
gulp.src('src/components/app/ionic.scss')
|
gulp.src('src/components/app/ionic.scss')
|
||||||
.pipe(sass({
|
.pipe(sass({
|
||||||
@ -137,12 +134,18 @@ gulp.task('angular2', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('examples', ['sass'], function() {
|
gulp.task('examples', ['sass'], function() {
|
||||||
return gulp.src('src/components/**/examples/**/*')
|
var examplesSrc = path.join(__dirname, 'src/components/**/examples/**/*');
|
||||||
|
var templateSrc = path.join(__dirname, 'scripts/examples/index.template.html');
|
||||||
|
var examplesDest = path.join(__dirname, 'dist/examples/');
|
||||||
|
|
||||||
|
return gulp.src(examplesSrc)
|
||||||
.pipe(gulpif(/index.html/, wrap({
|
.pipe(gulpif(/index.html/, wrap({
|
||||||
src: 'scripts/examples/index.template.html'
|
src: templateSrc
|
||||||
})))
|
})))
|
||||||
.pipe(rename(function(file) {
|
.pipe(rename(function(file) {
|
||||||
file.dirname = file.dirname.replace('/examples/', '/');
|
file.dirname = file.dirname.replace('/examples/', '/');
|
||||||
}))
|
}))
|
||||||
.pipe(gulp.dest('dist/examples/'));
|
.pipe(gulp.dest(examplesDest));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
require('./scripts/snapshot/snapshot.task')(gulp, argv, buildConfig);
|
||||||
|
10
package.json
10
package.json
@ -2,6 +2,7 @@
|
|||||||
"name": "ionic2",
|
"name": "ionic2",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"canonical-path": "0.0.2",
|
||||||
"connect": "^3.3.4",
|
"connect": "^3.3.4",
|
||||||
"del": "~1.1.1",
|
"del": "~1.1.1",
|
||||||
"gulp": "~3.8.10",
|
"gulp": "~3.8.10",
|
||||||
@ -16,11 +17,18 @@
|
|||||||
"gulp-sass": "^1.3.3",
|
"gulp-sass": "^1.3.3",
|
||||||
"gulp-shell": "^0.4.0",
|
"gulp-shell": "^0.4.0",
|
||||||
"gulp-traceur": "0.16.*",
|
"gulp-traceur": "0.16.*",
|
||||||
|
"gulp-util": "^3.0.4",
|
||||||
"gulp-wrap": "^0.11.0",
|
"gulp-wrap": "^0.11.0",
|
||||||
"karma": "^0.12.31",
|
"karma": "^0.12.31",
|
||||||
|
"lodash": "^2.4.1",
|
||||||
|
"lodash.template": "^2.4.1",
|
||||||
|
"node-uuid": "^1.4.1",
|
||||||
|
"q": "^1.2.0",
|
||||||
|
"request": "^2.53.0",
|
||||||
"serve-static": "~1.8.1",
|
"serve-static": "~1.8.1",
|
||||||
"systemjs": "^0.11.3",
|
"systemjs": "^0.11.3",
|
||||||
"through2": "~0.6.3"
|
"through2": "~0.6.3",
|
||||||
|
"yargs": "^3.6.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"angular2": "2.0.0-alpha.13",
|
"angular2": "2.0.0-alpha.13",
|
||||||
|
@ -15,5 +15,6 @@ module.exports = {
|
|||||||
'node_modules/systemjs/lib/extension-register.js',
|
'node_modules/systemjs/lib/extension-register.js',
|
||||||
'node_modules/angular2/node_modules/zone.js/zone.js',
|
'node_modules/angular2/node_modules/zone.js/zone.js',
|
||||||
'node_modules/hammerjs/hammer.js'
|
'node_modules/hammerjs/hammer.js'
|
||||||
]
|
],
|
||||||
|
protractorPort: 8876
|
||||||
};
|
};
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
|
|
||||||
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
|
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
|
||||||
<link rel="stylesheet" href="/dist/css/ionic.css" />
|
<link rel="stylesheet" href="/css/ionic.css" />
|
||||||
<script src="/jspm_packages/system.js"></script>
|
<script src="/jspm_packages/system.js"></script>
|
||||||
<script src="/jspm-config.js"></script>
|
<script src="/jspm-config.js"></script>
|
||||||
<script src="https://cdn.rawgit.com/angular/zone.js/v0.4.1/zone.js"></script>
|
<script src="https://cdn.rawgit.com/angular/zone.js/v0.4.1/zone.js"></script>
|
||||||
|
140
scripts/snapshot/ionic.snapshot.js
Normal file
140
scripts/snapshot/ionic.snapshot.js
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
var q = require('q');
|
||||||
|
|
||||||
|
var IonicSnapshot = function(options) {
|
||||||
|
|
||||||
|
// modules
|
||||||
|
var _ = require('lodash');
|
||||||
|
var request = require('request');
|
||||||
|
var colors = require('gulp-util').colors;
|
||||||
|
var log = console.log.bind(console, '[' + colors.cyan('IonicReporter') + ']');
|
||||||
|
|
||||||
|
var IonicReporter = function(options) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
// set options and defaults
|
||||||
|
self.domain = options.domain || 'ionic-snapshot-go.appspot.com';
|
||||||
|
self.groupId = options.groupId || 'test_group';
|
||||||
|
self.appId = options.appId || 'test_app';
|
||||||
|
self.testId = browser.params.test_id || 'test_id';
|
||||||
|
self.platformId = browser.params.platform_id;
|
||||||
|
self.platformIndex = browser.params.platform_index;
|
||||||
|
self.platformCount = browser.params.platform_count;
|
||||||
|
self.sleepBetweenSpecs = options.sleepBetweenSpecs || 400;
|
||||||
|
self.width = browser.params.width || -1;
|
||||||
|
self.height = browser.params.height || -1;
|
||||||
|
self.highestMismatch = 0;
|
||||||
|
self.screenshotRequestPromises = [];
|
||||||
|
|
||||||
|
self.flow = protractor.promise.controlFlow();
|
||||||
|
|
||||||
|
if(self.width > 0 && self.height > 0) {
|
||||||
|
self.flow.execute(function(){
|
||||||
|
return browser.driver.manage().window().setSize(self.width, self.height);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
self.flow.execute(function(){
|
||||||
|
return browser.getCapabilities().then(function (capabilities) {
|
||||||
|
self.testData = {
|
||||||
|
group_id: self.groupId,
|
||||||
|
app_id: self.appId,
|
||||||
|
test_id: self.testId,
|
||||||
|
platform_id: self.platformId,
|
||||||
|
platform_index: self.platformIndex,
|
||||||
|
platform_count: self.platformCount,
|
||||||
|
width: self.width,
|
||||||
|
height: self.height,
|
||||||
|
browser: capabilities.get('browserName'),
|
||||||
|
platform: capabilities.get('platform'),
|
||||||
|
version: capabilities.get('version'),
|
||||||
|
access_key: options.accessKey
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
process.on('exit', function() {
|
||||||
|
log(colors.green('Highest Mismatch:'), self.highestMismatch, '%');
|
||||||
|
});
|
||||||
|
|
||||||
|
log('init:', _.pick(self, ['testId', 'appId', 'width', 'height', 'platformId']));
|
||||||
|
};
|
||||||
|
|
||||||
|
IonicReporter.prototype.reportSpecResults = function(spec) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if(!self.testData.total_specs) {
|
||||||
|
self.testData.total_specs = 0;
|
||||||
|
var allSpecs = jasmine.getEnv().currentRunner().specs();
|
||||||
|
for(var sId in allSpecs) {
|
||||||
|
self.testData.total_specs++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.flow.execute(function(){
|
||||||
|
var d = protractor.promise.defer();
|
||||||
|
|
||||||
|
browser.waitForAngular().then(function(){
|
||||||
|
|
||||||
|
browser.getCurrentUrl().then(function(currentUrl) {
|
||||||
|
|
||||||
|
browser.sleep(self.sleepBetweenSpecs).then(function(){
|
||||||
|
|
||||||
|
browser.takeScreenshot().then(function(pngBase64){
|
||||||
|
var specIdString = '[' + (spec.id+1) + '/' + self.testData.total_specs + ']';
|
||||||
|
log(specIdString, spec.getFullName());
|
||||||
|
|
||||||
|
self.testData.spec_index = spec.id;
|
||||||
|
self.testData.description = spec.getFullName();
|
||||||
|
self.testData.highest_mismatch = self.highestMismatch;
|
||||||
|
self.testData.png_base64 = pngBase64;
|
||||||
|
self.testData.url = currentUrl;
|
||||||
|
pngBase64 = null;
|
||||||
|
|
||||||
|
var requestDeferred = q.defer();
|
||||||
|
self.screenshotRequestPromises.push(requestDeferred.promise);
|
||||||
|
|
||||||
|
request.post(
|
||||||
|
'http://' + self.domain + '/screenshot',
|
||||||
|
{ form: self.testData },
|
||||||
|
function (error, response, body) {
|
||||||
|
log(specIdString, 'reportSpecResults:', body);
|
||||||
|
try {
|
||||||
|
var rspData = JSON.parse(body);
|
||||||
|
self.highestMismatch = Math.max(self.highestMismatch, rspData.Mismatch);
|
||||||
|
} catch(e) {
|
||||||
|
log(specIdString, colors.red('reportSpecResults', 'error posting screenshot:'), e);
|
||||||
|
}
|
||||||
|
requestDeferred.resolve();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
d.fulfill();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return d.promise;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
IonicReporter.prototype.reportRunnerResults = function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
self.flow.execute(function() {
|
||||||
|
var d = protractor.promise.defer();
|
||||||
|
log('Waiting for all screenshots to be posted...');
|
||||||
|
// allSettled waits until all the promises are done, whether they are rejected or resolved
|
||||||
|
q.allSettled(self.screenshotRequestPromises).then(function(all) {
|
||||||
|
d.fulfill();
|
||||||
|
log('Finished!');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
this.jasmine.getEnv().addReporter( new IonicReporter(options) );
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = IonicSnapshot;
|
32
scripts/snapshot/protractor.config.js
Normal file
32
scripts/snapshot/protractor.config.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
var buildConfig = require('../build/config');
|
||||||
|
var path = require('canonical-path');
|
||||||
|
var projectRoot = path.resolve(__dirname, '../..');
|
||||||
|
|
||||||
|
exports.config = {
|
||||||
|
|
||||||
|
// Spec patterns are relative to the location of the spec file. They may
|
||||||
|
// include glob patterns.
|
||||||
|
specs: [
|
||||||
|
path.resolve(projectRoot, 'dist/examples/**/*.scenario.js'),
|
||||||
|
],
|
||||||
|
|
||||||
|
// Options to be passed to Jasmine-node.
|
||||||
|
jasmineNodeOpts: {
|
||||||
|
showColors: true, // Use colors in the command line report.
|
||||||
|
defaultTimeoutInterval: 120000,
|
||||||
|
isVerbose: true
|
||||||
|
},
|
||||||
|
|
||||||
|
baseUrl: 'http://localhost:' + buildConfig.protractorPort,
|
||||||
|
|
||||||
|
onPrepare: function() {
|
||||||
|
var ionicSnapshot = require('./ionic.snapshot.js');
|
||||||
|
ionicSnapshot({
|
||||||
|
groupId: 'ionic2',
|
||||||
|
appId: 'snapshots',
|
||||||
|
accessKey: process.env.IONIC_SNAPSHOT_KEY
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
75
scripts/snapshot/snapshot.task.js
Normal file
75
scripts/snapshot/snapshot.task.js
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
var _ = require('lodash');
|
||||||
|
var http = require('http');
|
||||||
|
var connect = require('connect');
|
||||||
|
var serveStatic = require('serve-static');
|
||||||
|
var cp = require('child_process');
|
||||||
|
var path = require('canonical-path');
|
||||||
|
var uuid = require('node-uuid');
|
||||||
|
|
||||||
|
var projectRoot = path.resolve(__dirname, '../..');
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = function(gulp, argv, buildConfig) {
|
||||||
|
|
||||||
|
var protractorHttpServer;
|
||||||
|
gulp.task('protractor-server', function() {
|
||||||
|
var app = connect().use(serveStatic(projectRoot + '/' + buildConfig.dist)); // serve everything that is static
|
||||||
|
protractorHttpServer = http.createServer(app).listen(buildConfig.protractorPort);
|
||||||
|
console.log('Serving `dist` on http://localhost:' + buildConfig.protractorPort);
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('snapshot', ['examples', 'protractor-server'], function(done) {
|
||||||
|
var configFile = path.resolve(projectRoot, 'scripts/snapshot/protractor.config.js');
|
||||||
|
snapshot(done, configFile);
|
||||||
|
});
|
||||||
|
|
||||||
|
var snapshotValues = _.merge({
|
||||||
|
browser: 'chrome',
|
||||||
|
platform: 'linux',
|
||||||
|
params: {
|
||||||
|
platform_id: 'chrome_local_test',
|
||||||
|
platform_index: 0,
|
||||||
|
platform_count: 1,
|
||||||
|
width: 400,
|
||||||
|
height: 800,
|
||||||
|
test_id: uuid.v4()
|
||||||
|
}
|
||||||
|
}, argv);
|
||||||
|
|
||||||
|
function snapshot(done, configFile) {
|
||||||
|
var protractorArgs = [
|
||||||
|
'--browser <%= browser %>',
|
||||||
|
'--platform <%= platform %>',
|
||||||
|
'--params.platform_id=<%= params.platform_id %>',
|
||||||
|
'--params.platform_index=<%= params.platform_index %>',
|
||||||
|
'--params.platform_count=<%= params.platform_count %>',
|
||||||
|
'--params.width=<%= params.width %>',
|
||||||
|
'--params.height=<%= params.height %>',
|
||||||
|
'--params.test_id=<%= params.test_id %>',
|
||||||
|
].map(function(argument) {
|
||||||
|
return _.template(argument, snapshotValues);
|
||||||
|
});
|
||||||
|
|
||||||
|
return protractor(done, [configFile].concat(protractorArgs));
|
||||||
|
}
|
||||||
|
|
||||||
|
function protractor(done, args) {
|
||||||
|
console.log('Start protractor');
|
||||||
|
|
||||||
|
var child = cp.spawn('protractor', args, {
|
||||||
|
stdio: [process.stdin, process.stdout, 'pipe']
|
||||||
|
});
|
||||||
|
|
||||||
|
var finish = _.once(function(err) {
|
||||||
|
err && done(err) || done();
|
||||||
|
protractorHttpServer.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
child.stderr.on('data', function(data) {
|
||||||
|
finish('Protractor tests failed. Error:', data.toString());
|
||||||
|
});
|
||||||
|
child.on('exit', function() {
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
describe('Protractor Demo App', function() {
|
||||||
|
it('should just be', function() {
|
||||||
|
browser.get('http://localhost:8876/examples/button/button-block/');
|
||||||
|
});
|
||||||
|
});
|
Reference in New Issue
Block a user