2017-07-11 21:47:40 +02:00
|
|
|
const assert = require('assert');
|
|
|
|
const sinon = require('sinon');
|
|
|
|
const proxyquire = require('proxyquire');
|
|
|
|
const request = require('supertest');
|
|
|
|
const fs = require('fs');
|
|
|
|
|
|
|
|
|
|
|
|
const logStub = {};
|
|
|
|
logStub.info = sinon.stub();
|
|
|
|
logStub.error = sinon.stub();
|
|
|
|
|
|
|
|
const storage = proxyquire('../../server/storage', {
|
|
|
|
'./log.js': function() {
|
|
|
|
return logStub;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
storage.flushall();
|
|
|
|
|
|
|
|
describe('Server integration tests', function() {
|
|
|
|
let server;
|
|
|
|
let storage;
|
|
|
|
let uuid;
|
2017-07-11 21:49:24 +02:00
|
|
|
let fileId;
|
2017-07-11 21:47:40 +02:00
|
|
|
|
|
|
|
before(function() {
|
2017-07-11 21:34:49 +02:00
|
|
|
const app = proxyquire('../../server/server', {
|
2017-07-11 21:47:40 +02:00
|
|
|
'./log.js': function() {
|
|
|
|
return logStub;
|
|
|
|
}
|
2017-07-11 21:34:49 +02:00
|
|
|
});
|
2017-07-11 21:47:40 +02:00
|
|
|
|
|
|
|
server = app.server;
|
|
|
|
storage = app.storage;
|
|
|
|
});
|
|
|
|
|
|
|
|
after(function() {
|
|
|
|
storage.flushall();
|
|
|
|
storage.quit();
|
|
|
|
server.close();
|
|
|
|
})
|
|
|
|
|
|
|
|
function upload() {
|
|
|
|
return request(server).post('/upload')
|
|
|
|
.field('fname', 'test_upload.txt')
|
|
|
|
.set('X-File-Metadata', JSON.stringify({
|
|
|
|
aad: '11111',
|
|
|
|
id: '111111111111111111111111',
|
|
|
|
filename: 'test_upload.txt'
|
|
|
|
}))
|
|
|
|
.attach('file', './test/test_upload.txt')
|
|
|
|
}
|
|
|
|
|
|
|
|
it('Responds with a 200 when the service is up', function() {
|
|
|
|
return request(server).get('/').expect(200);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('Rejects with a 404 when a file id is not valid', function() {
|
|
|
|
return request(server).post('/upload/123')
|
|
|
|
.field('fname', 'test_upload.txt')
|
|
|
|
.set('X-File-Metadata', JSON.stringify({
|
|
|
|
'silly': 'text'
|
|
|
|
}))
|
|
|
|
.attach('file', './test/test_upload.txt')
|
|
|
|
.expect(404)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Accepts a file and stores it when properly uploaded', function(done) {
|
|
|
|
upload().then(res => {
|
|
|
|
assert(res.body.hasOwnProperty('delete'));
|
|
|
|
uuid = res.body.delete;
|
|
|
|
assert(res.body.hasOwnProperty('url'));
|
|
|
|
assert(res.body.hasOwnProperty('id'));
|
|
|
|
fileId = res.body.id;
|
|
|
|
fs.access('./static/' + fileId, fs.constants.F_OK, err => {
|
|
|
|
if (err) {
|
|
|
|
done(new Error('The file does not exist'));
|
|
|
|
} else {
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Responds with a 200 if a file exists', function() {
|
|
|
|
return request(server).get('/exists/' + fileId)
|
|
|
|
.expect(200)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Exists in the redis server', function() {
|
|
|
|
return storage.exists(fileId)
|
|
|
|
.then(() => assert(1))
|
|
|
|
.catch(err => assert.fail())
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Fails delete if the delete token does not match', function() {
|
|
|
|
return request(server).post('/delete/' + fileId)
|
|
|
|
.send({ delete_token: 11 })
|
|
|
|
.expect(404);
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Fails delete if the id is invalid', function() {
|
|
|
|
return request(server).post('/delete/1')
|
|
|
|
.expect(404);
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Successfully deletes if the id is valid and the delete token matches', function(done) {
|
|
|
|
request(server).post('/delete/' + fileId)
|
|
|
|
.send({ delete_token: uuid })
|
|
|
|
.expect(200)
|
|
|
|
.then(() => {
|
|
|
|
fs.access('./static/' + fileId, fs.constants.F_OK, err => {
|
|
|
|
if (err) {
|
|
|
|
done();
|
|
|
|
} else {
|
|
|
|
done(new Error('The file does not exist'));
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Responds with a 404 if a file does not exist', function() {
|
|
|
|
return request(server).get('/exists/notfound')
|
|
|
|
.expect(404)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Uploads properly after a delete', function(done) {
|
|
|
|
upload().then(res => {
|
|
|
|
assert(res.body.hasOwnProperty('delete'));
|
|
|
|
uuid = res.body.delete;
|
|
|
|
assert(res.body.hasOwnProperty('url'));
|
|
|
|
assert(res.body.hasOwnProperty('id'));
|
|
|
|
fileId = res.body.id;
|
|
|
|
fs.access('./static/' + fileId, fs.constants.F_OK, err => {
|
|
|
|
if (err) {
|
|
|
|
done(new Error('The file does not exist'));
|
|
|
|
} else {
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Responds with a 200 for the download page', function() {
|
|
|
|
return request(server).get('/download/' + fileId)
|
|
|
|
.expect(200);
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Downloads a file properly', function() {
|
|
|
|
return request(server).get('/assets/download/' + fileId)
|
|
|
|
.then(res => {
|
|
|
|
assert(res.header.hasOwnProperty('content-disposition'));
|
|
|
|
assert(res.header.hasOwnProperty('content-type'))
|
|
|
|
assert(res.header.hasOwnProperty('content-length'))
|
|
|
|
assert(res.header.hasOwnProperty('x-file-metadata'))
|
|
|
|
assert.equal(res.header['content-disposition'], 'attachment; filename=test_upload.txt')
|
|
|
|
assert.equal(res.header['content-type'], 'application/octet-stream')
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('The file is deleted after one download', function() {
|
|
|
|
assert(!fs.existsSync('./static/' + fileId));
|
|
|
|
})
|
|
|
|
|
|
|
|
it('No longer exists in the redis server', function() {
|
|
|
|
return storage.exists(fileId)
|
|
|
|
.then(() => assert.fail())
|
|
|
|
.catch(err => assert(1))
|
|
|
|
})
|
2017-07-11 21:34:49 +02:00
|
|
|
});
|