2017-10-13 18:08:13 -04:00
|
|
|
process.env.NODE_ENV = 'test';
|
|
|
|
|
2018-07-25 21:34:16 -04:00
|
|
|
const chai = require('chai');
|
|
|
|
chai.use(require('chai-http'));
|
2017-10-13 18:08:13 -04:00
|
|
|
|
2018-07-26 19:40:42 -04:00
|
|
|
const ModelPath = '../app/models/';
|
|
|
|
const User = require(ModelPath + 'User.js');
|
|
|
|
const Upload = require(ModelPath + 'Upload.js');
|
|
|
|
const Key = require(ModelPath + 'Key.js');
|
|
|
|
const Invite = require(ModelPath + 'Invite.js');
|
2018-07-25 01:44:45 -04:00
|
|
|
|
2018-07-26 13:17:37 -04:00
|
|
|
const Buffer = require('buffer').Buffer;
|
|
|
|
const crypto = require('crypto');
|
2018-07-26 16:54:08 -04:00
|
|
|
const fs = require('fs');
|
|
|
|
const fsPromises = fs.promises;
|
2018-07-26 13:17:37 -04:00
|
|
|
|
2018-07-28 17:13:19 -04:00
|
|
|
//---------------- RESPONSE VERIFICATION ----------------//
|
|
|
|
|
|
|
|
exports.verifyResponse = (res, status, message) => {
|
|
|
|
res.should.have.status(status);
|
|
|
|
res.body.should.be.a('object');
|
|
|
|
res.body.should.have.property('message').equal(message);
|
|
|
|
};
|
|
|
|
|
|
|
|
exports.verifyResponseObj = (res, status, obj) => {
|
|
|
|
res.should.have.status(status);
|
|
|
|
res.body.should.deep.equal(obj);
|
|
|
|
};
|
|
|
|
|
2017-10-13 18:08:13 -04:00
|
|
|
//---------------- DATABASE UTIL ----------------//
|
|
|
|
|
2018-07-26 16:54:08 -04:00
|
|
|
exports.clearDatabase = () =>
|
2018-07-25 18:45:38 -04:00
|
|
|
Promise.all([
|
|
|
|
User.remove({}),
|
|
|
|
Invite.remove({}),
|
2018-07-26 13:19:47 -04:00
|
|
|
Key.remove({}),
|
2018-07-25 18:45:38 -04:00
|
|
|
Upload.remove({})
|
|
|
|
]);
|
|
|
|
|
2018-07-28 17:13:19 -04:00
|
|
|
exports.insertInvite = invite =>
|
|
|
|
Invite.create(invite);
|
|
|
|
|
|
|
|
exports.insertKey = key =>
|
|
|
|
Key.create(key);
|
|
|
|
|
2018-07-25 18:45:38 -04:00
|
|
|
//---------------- API ROUTES ----------------//
|
|
|
|
|
2018-07-26 16:54:08 -04:00
|
|
|
exports.login = (credentials, agent) =>
|
2018-07-28 17:13:19 -04:00
|
|
|
agent.post('/api/auth/login')
|
2018-07-25 18:45:38 -04:00
|
|
|
.send(credentials);
|
2017-10-13 18:08:13 -04:00
|
|
|
|
2018-07-26 13:17:37 -04:00
|
|
|
exports.logout = agent =>
|
2018-07-28 17:13:19 -04:00
|
|
|
agent.post('/api/auth/logout');
|
2017-10-13 18:08:13 -04:00
|
|
|
|
2018-07-26 16:54:08 -04:00
|
|
|
exports.registerUser = (user, agent) =>
|
2018-07-28 17:13:19 -04:00
|
|
|
agent.post('/api/auth/register')
|
2018-07-25 18:45:38 -04:00
|
|
|
.send(user);
|
2017-10-13 18:08:13 -04:00
|
|
|
|
2018-07-26 16:54:08 -04:00
|
|
|
exports.whoami = (agent) =>
|
2018-07-28 17:13:19 -04:00
|
|
|
agent.get('/api/auth/whoami')
|
2018-07-25 21:34:16 -04:00
|
|
|
.send();
|
|
|
|
|
2018-07-25 18:45:38 -04:00
|
|
|
//---------------- TEST ENTRY CREATION ----------------//
|
2017-10-13 18:08:13 -04:00
|
|
|
|
2018-07-26 16:54:08 -04:00
|
|
|
exports.createTestInvite = () =>
|
2018-07-28 17:13:19 -04:00
|
|
|
exports.insertInvite({code: 'code', scope: ['file.upload'], issuer: 'Mocha'});
|
2017-10-13 18:08:13 -04:00
|
|
|
|
2018-07-26 16:54:08 -04:00
|
|
|
exports.createTestInvites = (n) =>
|
2018-07-26 13:17:37 -04:00
|
|
|
Promise.all(
|
|
|
|
Array.from(new Array(n), (val, index) => 'code' + index)
|
2018-07-28 17:13:19 -04:00
|
|
|
.map(code => exports.insertInvite({code: code, scope: ['file.upload'], issuer: 'Mocha'}))
|
2018-07-26 13:17:37 -04:00
|
|
|
);
|
2017-10-13 18:08:13 -04:00
|
|
|
|
2018-07-26 13:17:37 -04:00
|
|
|
exports.createTestUser = async agent => {
|
2018-07-25 18:45:38 -04:00
|
|
|
await exports.createTestInvite();
|
2018-07-28 18:22:48 -04:00
|
|
|
return exports.registerUser({displayname: 'user', password: 'pass', invite: 'code'}, agent);
|
2017-10-13 18:08:13 -04:00
|
|
|
};
|
|
|
|
|
2018-07-26 13:17:37 -04:00
|
|
|
exports.createTestSession = async agent => {
|
|
|
|
await exports.createTestUser(agent);
|
2018-07-26 19:40:42 -04:00
|
|
|
return exports.login({displayname: 'user', password: 'pass'}, agent);
|
2017-10-13 18:08:13 -04:00
|
|
|
};
|
|
|
|
|
2018-07-28 17:13:19 -04:00
|
|
|
exports.createSession = async (agent, scope, displayname) => {
|
|
|
|
await exports.insertInvite({code: 'code', scope: scope, issuer: 'Mocha'});
|
|
|
|
await exports.registerUser({displayname: displayname ? displayname : 'user', password: 'pass', invite: 'code'}, agent);
|
|
|
|
await exports.login({displayname: displayname ? displayname : 'user', password: 'pass'}, agent);
|
|
|
|
await Invite.deleteOne({code: 'code'});
|
|
|
|
};
|
|
|
|
|
2018-07-26 16:54:08 -04:00
|
|
|
exports.createTestFile = (size, name) =>
|
|
|
|
fsPromises.writeFile(name, Buffer.allocUnsafe(size));
|
2017-10-13 18:08:13 -04:00
|
|
|
|
2018-07-28 17:13:19 -04:00
|
|
|
exports.createTestKey = scope =>
|
|
|
|
exports.insertKey({key: 'key', identifier: 'test', scope: scope, issuer: 'Mocha'});
|
|
|
|
|
2018-07-26 16:54:08 -04:00
|
|
|
//---------------- FILESYSTEM ----------------//
|
|
|
|
|
|
|
|
exports.deleteFile = file =>
|
|
|
|
fsPromises.unlink(file);
|
|
|
|
|
|
|
|
exports.fileExists = file =>
|
|
|
|
fsPromises.access(file, fs.constants.R_OK);
|
|
|
|
|
|
|
|
exports.fileSize = async file =>
|
|
|
|
(await fsPromises.stat(file)).size;
|
|
|
|
|
|
|
|
exports.fileHash = file =>
|
|
|
|
new Promise((resolve, reject) => {
|
|
|
|
const hash = crypto.createHash('MD5');
|
|
|
|
fs.createReadStream(file)
|
|
|
|
.on('error', reject)
|
|
|
|
.on('data', chunk => hash.update(chunk))
|
|
|
|
.on('end', () => resolve(hash.digest('hex')));
|
|
|
|
});
|
|
|
|
|
|
|
|
exports.directoryFileCount = async dir =>
|
|
|
|
(await fsPromises.readdir(dir)).length;
|
2017-10-13 18:08:13 -04:00
|
|
|
|
2018-07-26 13:17:37 -04:00
|
|
|
//---------------- UPLOADS ----------------//
|
2017-10-13 18:08:13 -04:00
|
|
|
|
2018-07-28 17:13:19 -04:00
|
|
|
exports.upload = (file, agent, key) => {
|
|
|
|
const request = agent.post('/api/upload');
|
|
|
|
|
|
|
|
if (key)
|
|
|
|
request.field('key', key);
|
|
|
|
|
|
|
|
return request.attach('file', file);
|
|
|
|
};
|
|
|
|
|
|
|
|
//---------------- Invites ----------------//
|
|
|
|
|
|
|
|
exports.createInvite = (invite, agent) =>
|
|
|
|
agent.post('/api/invites/create')
|
|
|
|
.send(invite);
|
|
|
|
|
|
|
|
exports.deleteInvite = (code, agent) =>
|
|
|
|
agent.post('/api/invites/delete')
|
|
|
|
.send({code: code});
|
|
|
|
|
|
|
|
exports.getInvites = (query, agent) =>
|
|
|
|
agent.get('/api/invites/get')
|
|
|
|
.send(query);
|