1
0
mirror of https://github.com/Foltik/Shimapan synced 2024-09-21 11:11:22 -04:00

Move test functions to util file

This commit is contained in:
Jack 2017-10-13 18:08:13 -04:00
parent 907478e6f1
commit 9a090d794d
Signed by: foltik
GPG Key ID: 303F88F996E95541
2 changed files with 288 additions and 230 deletions

View File

@ -5,203 +5,32 @@ var async = require('async');
var mongoose = require('mongoose');
var User = require('../app/models/User.js');
var Invite = require('../app/models/Invite.js');
var Upload = require('../app/models/Upload.js');
var Token = require('../app/models/Token.js');
var fs = require('fs');
var path = require('path');
var chai = require('chai');
var http = require('chai-http');
var should = chai.should();
var app = require('../server');
var server = app.server;
var db = app.db;
chai.use(http);
function register(user, cb) {
chai.request(server)
.post('/api/auth/register')
.send(user)
.end(cb);
}
function verifySuccessfulRegister(user, done) {
register(user, function (err, res) {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('token');
done();
});
}
function verifyFailedUserRegister(user, done) {
register(user, function (err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('Username in use.');
done();
});
}
function verifyFailedInviteRegister(user, done) {
register(user, function (err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('Invalid invite code.');
done();
})
}
function login(user, cb) {
chai.request(server)
.post('/api/auth/login')
.send(user)
.end(cb);
}
function verifySuccessfulLogin(user, done) {
login(user, function (err, res) {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('token');
done();
});
}
function verifyFailedUsernameLogin(user, done) {
login(user, function (err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('Invalid username.');
done();
});
}
function verifyFailedPasswordLogin(user, done) {
login(user, function (err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('Invalid password.');
done();
});
}
function upload(token, cb) {
chai.request(server)
.post('/api/upload')
.attach('file', 'test/test.png')
.set('Authorization', 'Bearer ' + token)
.end(cb);
}
function loginUpload(user, cb) {
login(user, function(err, res) {
upload(res.body.token, cb);
});
}
function verifySuccessfulUpload(user, done) {
loginUpload(user, function(err, res) {
res.should.have.status(200);
res.body.should.have.be.a('object');
res.body.should.have.property('name');
res.body.should.have.property('oname');
res.body.should.have.property('created');
done();
});
}
function verifyFailedSizeUpload(user, done) {
loginUpload(user, done, function(err, res) {
//TODO
});
}
function verifyFailedPermissionUpload(user, done) {
loginUpload(user, function(err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('Permission error.');
done();
});
}
function verifyFailedAuthUpload(done) {
async.parallel([
function(cb) {
upload('bogus', function (err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('UnauthorizedError: jwt malformed');
cb();
});
},
function(cb) {
upload('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.' +
'eyJpc3MiOiJzaGltYXBhbi5yb2NrcyIsImlhd' +
'CI6MTUwNzkyNTAyNSwiZXhwIjoxNTM5NDYxMD' +
'I1LCJhdWQiOiJ3d3cuc2hpbWFwYW4ucm9ja3M' +
'iLCJzdWIiOiJUZXN0VXNlciIsInVzZXJuYW1l' +
'IjoiVGVzdFVzZXIiLCJzY29wZSI6ImZpbGUud' +
'XBsb2FkIn0.e746_BNNuxlbXKESKKYsxl6e5j' +
'8JwmEFxO3zRf66tWo', function(err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('UnauthorizedError: invalid signature');
cb();
})
}
], function(err, res) {
if (err) console.log(err);
done();
});
}
var util = require('./testUtil.js');
before(function (done) {
async.series([
function (cb) {
db.once('open', function () {
cb();
});
util.resetDatabase(cb);
},
function (cb) {
User.remove({}, function (err) {
cb(err);
});
},
function (cb) {
Invite.remove({}, function (err) {
cb(err);
});
},
function (cb) {
var inv = new Invite();
inv.code = 'TestCode1';
inv.scope = ['test.perm'];
inv.save(function (err) {
cb(err);
});
},
function (cb) {
var inv = new Invite();
inv.code = 'TestCode2';
inv.scope = ['test.perm', 'file.upload'];
inv.save(function (err) {
cb(err);
});
},
function (cb) {
var inv = new Invite();
inv.code = 'TestCode3';
var yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
inv.exp = yesterday;
inv.scope = ['test.perm', 'file.upload'];
inv.save(function (err) {
cb(err);
});
function(cb) {
util.createInvites([{
code: 'TestCode1',
scope: ['test.perm']
}, {
code: 'TestCode2'
}, {
code: 'TestCode3',
exp: new Date() - 1
}
], cb);
}
], function (err) {
if (err) console.log(err);
@ -212,92 +41,74 @@ before(function (done) {
describe('Users', function () {
describe('/POST register', function () {
it('SHOULD register valid user, valid invite', function (done) {
var user = {
util.verifySuccessfulRegister({
username: 'TestUser1',
password: 'TestPassword',
invite: 'TestCode1'
};
verifySuccessfulRegister(user, done);
}, done);
});
it('SHOULD register another valid user, valid invite', function(done) {
var user = {
util.verifySuccessfulRegister({
username: 'TestUser2',
password: 'TestPassword',
invite: 'TestCode2'
};
verifySuccessfulRegister(user, done);
}, done);
});
it('SHOULD NOT register invalid user, valid invite', function (done) {
var user = {
util.verifyFailedUserRegister({
username: 'TestUser1',
password: 'TestPassword',
invite: 'TestCode2'
};
verifyFailedUserRegister(user, done);
}, done);
});
it('SHOULD NOT register valid user, nonexistant invite', function (done) {
var user = {
util.verifyFailedInviteRegister({
username: 'TestUser3',
password: 'TestPassword',
invite: 'bogus'
};
verifyFailedInviteRegister(user, done);
}, done);
});
it('SHOULD NOT register valid user, used invite', function (done) {
var user = {
util.verifyFailedInviteRegister({
username: 'TestUser3',
password: 'TestPassword',
invite: 'TestCode1'
};
verifyFailedInviteRegister(user, done);
}, done);
});
it('SHOULD NOT register valid user, expired invite', function (done) {
var user = {
util.verifyFailedInviteRegister({
username: 'TestUser3',
password: 'TestPassword',
invite: 'TestCode3'
};
verifyFailedInviteRegister(user, done);
}, done);
})
});
describe('/POST login', function () {
it('SHOULD accept valid user, valid password', function (done) {
var user = {
util.verifySuccessfulLogin({
username: 'TestUser1',
password: 'TestPassword'
};
verifySuccessfulLogin(user, done);
}, done);
});
it('SHOULD NOT accept valid user, invalid password', function (done) {
var user = {
util.verifyFailedPasswordLogin({
username: 'TestUser1',
password: 'bogus'
};
verifyFailedPasswordLogin(user, done);
}, done);
});
it('SHOULD NOT accept invalid user, any password', function (done) {
var user = {
util.verifyFailedUsernameLogin({
username: 'BogusTestUser',
password: 'bogus'
};
verifyFailedUsernameLogin(user, done);
}, done);
});
});
@ -306,25 +117,28 @@ describe('Users', function () {
describe('Uploads', function () {
describe('/POST upload', function () {
it('SHOULD accept logged in valid upload', function(done) {
var user = {
util.verifySuccessfulUpload({
username: 'TestUser2',
password: 'TestPassword'
};
verifySuccessfulUpload(user, done);
}, done);
});
it('SHOULD NOT accept unauthenticated valid upload', function(done) {
verifyFailedAuthUpload(done);
util.verifyFailedAuthUpload(done);
});
it('SHOULD NOT accept invalid permission, valid upload', function(done) {
var user = {
util.verifyFailedPermissionUpload({
username: 'TestUser1',
password: 'TestPassword'
};
}, done);
});
verifyFailedPermissionUpload(user, done);
it('SHOULD NOT accept invalid size upload', function(done) {
util.verifyFailedSizeUpload({
username: 'TestUser2',
password: 'TestPassword'
}, done);
})
});
});

244
test/testUtil.js Normal file
View File

@ -0,0 +1,244 @@
process.env.NODE_ENV = 'test';
var async = require('async');
var mongoose = require('mongoose');
var User = require('../app/models/User.js');
var Invite = require('../app/models/Invite.js');
var Upload = require('../app/models/Upload.js');
var Token = require('../app/models/Token.js');
var chai = require('chai');
var http = require('chai-http');
var app = require('../server');
var server = app.server;
var db = app.db;
chai.use(http);
//---------------- DATABASE UTIL ----------------//
var resetDatabase = function(callback) {
db.once('open', function() {
async.each([
User, Invite, Upload, Token
], function(schema, cb) {
schema.remove({}, function(err) {
cb(err);
});
}, function(err) {
if (err) console.log(err);
callback();
});
});
};
var createInvites = function(invites, callback) {
async.each(invites, function(invite, cb) {
if (!invite.scope) {
invite.scope = ['test.perm', 'file.upload'];
}
if (!invite.exp) {
var date = new Date();
date.setDate(date.getDate() + 7);
invite.exp = date;
}
invite.issuer = 'Mocha';
invite.issued = new Date();
Invite.create(invite, function(err) {
cb(err);
});
}, function(err) {
if (err) console.log(err);
callback();
})
};
//---------------- REGISTER UTIL ----------------//
var register = function(user, cb) {
chai.request(server)
.post('/api/auth/register')
.send(user)
.end(cb);
};
var verifySuccessfulRegister = function(user, done) {
register(user, function (err, res) {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('token');
done();
});
};
var verifyFailedUserRegister = function(user, done) {
register(user, function (err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('Username in use.');
done();
});
};
var verifyFailedInviteRegister = function(user, done) {
register(user, function (err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('Invalid invite code.');
done();
})
};
//---------------- LOGIN UTIL ----------------//
var login = function(user, cb) {
chai.request(server)
.post('/api/auth/login')
.send(user)
.end(cb);
};
var verifySuccessfulLogin = function(user, done) {
login(user, function (err, res) {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('token');
done();
});
};
var verifyFailedUsernameLogin = function(user, done) {
login(user, function (err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('Invalid username.');
done();
});
};
var verifyFailedPasswordLogin = function(user, done) {
login(user, function (err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('Invalid password.');
done();
});
};
//---------------- UPLOAD UTIL ----------------//
var upload = function(token, file, cb) {
chai.request(server)
.post('/api/upload')
.attach('file', file)
.set('Authorization', 'Bearer ' + token)
.end(cb);
};
var loginUpload = function(user, cb) {
login(user, function(err, res) {
upload(res.body.token, 'test/test.png', cb);
});
};
var loginUploadFile = function(user, file, cb) {
login(user, function(err, res) {
upload(res.body.token, file, cb);
});
};
var verifySuccessfulUpload = function(user, done) {
loginUpload(user, function(err, res) {
res.should.have.status(200);
res.body.should.have.be.a('object');
res.body.should.have.property('name');
res.body.should.have.property('oname');
res.body.should.have.property('created');
done();
});
};
var verifyFailedSizeUpload = function(user, done) {
loginUploadFile(user, 'test/large.bin', function(err, res) {
res.should.have.status(413);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('File too large.');
done();
});
};
var verifyFailedPermissionUpload = function(user, done) {
loginUpload(user, function(err, res) {
res.should.have.status(403);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('Permission error.');
done();
});
};
var verifyFailedAuthUpload = function(done) {
async.parallel([
function(cb) {
upload('bogus', 'test/test.png', function (err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('UnauthorizedError: jwt malformed');
cb();
});
},
function(cb) {
upload('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.' +
'eyJpc3MiOiJzaGltYXBhbi5yb2NrcyIsImlhd' +
'CI6MTUwNzkyNTAyNSwiZXhwIjoxNTM5NDYxMD' +
'I1LCJhdWQiOiJ3d3cuc2hpbWFwYW4ucm9ja3M' +
'iLCJzdWIiOiJUZXN0VXNlciIsInVzZXJuYW1l' +
'IjoiVGVzdFVzZXIiLCJzY29wZSI6ImZpbGUud' +
'XBsb2FkIn0.e746_BNNuxlbXKESKKYsxl6e5j' +
'8JwmEFxO3zRf66tWo',
'test/test.png',
function(err, res) {
res.should.have.status(401);
res.body.should.be.a('object');
res.body.should.have.property('message').eql('UnauthorizedError: invalid signature');
cb();
})
}
], function(err, res) {
if (err) console.log(err);
done();
});
};
module.exports = {
resetDatabase: resetDatabase,
createInvites: createInvites,
register: register,
verifySuccessfulRegister: verifySuccessfulRegister,
verifyFailedUserRegister: verifyFailedUserRegister,
verifyFailedInviteRegister: verifyFailedInviteRegister,
login: login,
verifySuccessfulLogin: verifySuccessfulLogin,
verifyFailedUsernameLogin: verifyFailedUsernameLogin,
verifyFailedPasswordLogin: verifyFailedPasswordLogin,
upload: upload,
loginUpload: loginUpload,
verifySuccessfulUpload: verifySuccessfulUpload,
verifyFailedAuthUpload: verifyFailedAuthUpload,
verifyFailedPermissionUpload: verifyFailedPermissionUpload,
verifyFailedSizeUpload: verifyFailedSizeUpload
};