Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions gulp/build.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
var gulp = require('gulp');
var bower = require('gulp-bower');

// Bower install.
gulp.task('bower', function() {
return bower();
});


// Build Choko.
gulp.task('build', ['bower']);
27 changes: 27 additions & 0 deletions gulp/publish.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
var gulp = require('gulp');
var git = require('gulp-git');
var spawn = require('child_process').spawn;

// Publish a new release to npm.
gulp.task('publish', ['build'], function(done) {
git.status({
// Use short format.
args: '-s'
},
function (err, stdout) {
if (err) {
throw err;
}
if (!stdout) {
// We have a clean working directory, proceed.
spawn('npm', ['publish'], {
stdio: 'inherit'
}).on('close', done);
}
else {
// Working directory not clean, abort.
console.log('Working directory not clean, aborting...');
done();
}
});
});
31 changes: 31 additions & 0 deletions gulp/server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/**
* Server related tasks.
*/

var fs = require('fs'),
gulp = require('gulp'), async = require('async'),
choko = require('../lib/application'),
server;

/**
* Initiate El-Tracker with a custom testing database.
*/
gulp.task('server:test', function (done) {

// Create a server.
module.exports.server = server = new choko('./test/applications/test-app');

// Start the server.
server.start(3000, function (error, server) {
var droppers = Object.keys(server.collections).map(function (collection) {
return function (next) {
server.collections[collection].drop(next);
};
});

// @todo: handle erros on droppers.
async.parallel(droppers, function (err) {
done();
});
});
});
46 changes: 46 additions & 0 deletions gulp/test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/**
* Test related tasks.
*/

var gulp = require('gulp'),
mocha = require('gulp-spawn-mocha'),
sequence = require('gulp-sequence'),
spawn = require('child_process').spawn,
app = require('./server');

/**
* Print buffer string.
*/
function logBuffer(data) {
console.log(data.toString());
}

/**
* E2E test: uses Protractor to perform e2e tests.
*/
gulp.task('test:e2e', ['server:test'], function (done) {
var protractor = spawn('protractor', ['test/e2e/protractor.conf.js']);

protractor.stdout.on('data', logBuffer);
protractor.stderr.on('data', logBuffer);

protractor.on('exit', function (code) {

// Stop server.
app.server.stop(done);

// @todo: fix Choko stop issue.
process.exit();
});
});

/**
* Unit test: uses Mocha to perform unit tests.
*/
gulp.task('test:unit', function() {
return gulp
.src(['test/unit/*.test.js'])
.pipe(mocha());
});

gulp.task('test', sequence('test:unit', 'test:e2e'));
38 changes: 3 additions & 35 deletions gulpfile.js
Original file line number Diff line number Diff line change
@@ -1,36 +1,4 @@
var gulp = require('gulp');
var bower = require('gulp-bower');
var git = require('gulp-git');
var spawn = require('child_process').spawn;
var requireAll = require('require-dir');

// Bower install.
gulp.task('bower', function() {
return bower();
});

// Publish a new release to npm.
gulp.task('publish', ['build'], function(done) {
git.status({
// Use short format.
args: '-s'
},
function (err, stdout) {
if (err) {
throw err;
}
if (!stdout) {
// We have a clean working directory, proceed.
spawn('npm', ['publish'], {
stdio: 'inherit'
}).on('close', done);
}
else {
// Working directory not clean, abort.
console.log('Working directory not clean, aborting...');
done();
}
});
});

// Build Choko.
gulp.task('build', ['bower']);
// Load all tasks.
requireAll('./gulp');
11 changes: 9 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
"version": "0.0.6",
"description": "High performance and high level web application framework.",
"scripts": {
"test": "mocha test"
"test": "gulp test",
"webdriver-update": "node ./node_modules/protractor/bin/webdriver-manager update"
},
"keywords": [
"framework",
Expand Down Expand Up @@ -39,10 +40,16 @@
},
"devDependencies": {
"bower": "*",
"gulp": "*",
"gulp": "^3.9.1",
"gulp-bower": "*",
"gulp-git": "*",
"gulp-protractor": "^2.3.0",
"gulp-sequence": "^0.4.5",
"gulp-spawn-mocha": "^2.2.2",
"jasmine-spec-reporter": "^2.4.0",
"mocha": "*",
"protractor": "3.0.0",
"require-dir": "^0.3.0",
"supertest": "0.13.x"
},
"bin": {
Expand Down
4 changes: 2 additions & 2 deletions test/applications/test-app/settings.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"database": "mongodb://localhost/test-application",
"database": "mongodb://172.17.0.2/test-application",
"sessionSecret": "no-secrets",
"application": {
"name": "Test application"
},
"extensions": {
"test-extension": {}
}
}
}
11 changes: 11 additions & 0 deletions test/e2e/page-objects/create-account-form.po.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
var CreateAccountForm = function() {

this.emailField = element(by.id('element-create-account-email'));
this.usernameField = element(by.id('element-create-account-username'));
this.passwordField = element(by.id('element-create-account-password'));
this.confirmPasswordField = element(by.id('element-create-account-password-confirm'));
this.submitButton = element(by.id('element-create-account-submit'));

};

module.exports = CreateAccountForm;
7 changes: 7 additions & 0 deletions test/e2e/page-objects/create-blog-post-form.po.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
var CreateBlogPostForm = function() {

this.saveButton = element(by.id('element-type-blog-submit'));

};

module.exports = CreateBlogPostForm;
12 changes: 12 additions & 0 deletions test/e2e/page-objects/home.po.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
var Home = function() {

this.signInLink = element(by.css('.btn-link'));
this.createAccountLink = element.all(by.css('.btn-primary')).first();

this.visit = function() {
browser.get('');
};

};

module.exports = Home;
7 changes: 7 additions & 0 deletions test/e2e/page-objects/partials/messages.po.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
var Messages = function() {

this.error = element(by.css('.alert-danger'));

};

module.exports = Messages;
9 changes: 9 additions & 0 deletions test/e2e/page-objects/sign-in-form.po.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
var SignInForm = function() {

this.usernameField = element(by.id('element-sign-in-username'));
this.passwordField = element(by.id('element-sign-in-password'));
this.submitButton = element(by.id('element-sign-in-submit'));

};

module.exports = SignInForm;
48 changes: 48 additions & 0 deletions test/e2e/protractor.conf.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
var SpecReporter = require('jasmine-spec-reporter');

exports.config = {
// Uses browser's own webdriver.
directConnect: true,

// Spec patterns are relative to the location of this config.
specs: [
'specs/*.spec.js'
],


capabilities: {
'browserName': 'chrome',
'chromeOptions': {'args': ['--disable-extensions']},

// Used for running all test files in paralel.
// Comment it to run all tests in one browser.
shardTestFiles: true,
maxInstances: 4,
},

// Define things that will happen before start testing.
onPrepare: function() {
// Add better test report on console.
jasmine.getEnv().addReporter(new SpecReporter({
displayFailuresSummary: true,
displayFailedSpec: true,
displaySuiteNumber: true,
displaySpecDuration: true
}));

browser.driver.manage().window().maximize();
},


// A base URL for your application under test. Calls to protractor.get()
// with relative paths will be prepended with this.
baseUrl: 'http://localhost:3000/',

jasmineNodeOpts: {
onComplete: null,
isVerbose: false,
showColors: true,
includeStackTrace: true,
defaultTimeoutInterval: 999999
}
};
45 changes: 45 additions & 0 deletions test/e2e/specs/create-account.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
var Home = require('../page-objects/home.po');
var CreateAccountForm = require('../page-objects/create-account-form.po');
var Messages = require('../page-objects/partials/messages.po');

describe( 'Create account', function() {

var home = new Home();
var createAccountForm = new CreateAccountForm();
var messages = new Messages();

beforeEach(function() {
home.visit();
home.createAccountLink.click();
});

it( 'navigate to create an account', function() {

browser.getCurrentUrl().then(function(url) {
expect(url).toEqual('http://localhost:3000/create-account');
});

});

it( 'try to create an account without filling any field', function() {

createAccountForm.submitButton.click();

expect(messages.error.isDisplayed()).toBe(true);

});

it( 'password must match', function() {

createAccountForm.emailField.sendKeys('valid@email.com');
createAccountForm.usernameField.sendKeys('joe');
createAccountForm.passwordField.sendKeys('abc');
createAccountForm.confirmPasswordField.sendKeys('def');

createAccountForm.submitButton.click();

expect(messages.error.isDisplayed()).toBe(true);

});

});
42 changes: 42 additions & 0 deletions test/e2e/specs/sign-in.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
var Home = require('../page-objects/home.po');
var Messages = require('../page-objects/partials/messages.po');
var SignInForm = require('../page-objects/sign-in-form.po');

describe( 'Sign in', function() {

var home = new Home();
var messages = new Messages();
var signInForm = new SignInForm();

beforeEach(function() {
home.visit();
home.signInLink.click();
});

it( 'navigate to sign in', function() {

browser.getCurrentUrl().then(function(url) {
expect(url).toEqual('http://localhost:3000/sign-in');
});

});

it( 'try to sign in without filling user and password', function() {

signInForm.submitButton.click();

expect(messages.error.isDisplayed()).toBe(true);

});

it( 'try to sign in with invalid user and password', function() {

signInForm.usernameField.sendKeys('invalid');
signInForm.passwordField.sendKeys('invalid');
signInForm.submitButton.click();

expect(messages.error.isDisplayed()).toBe(true);

});

});
1 change: 1 addition & 0 deletions test/mocha.opts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
test/unit
--recursive
--timeout 10000
Loading