A simple file sharing site with an easy to use API and online panel.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

229 rindas
6.1KB

  1. process.env.NODE_ENV = 'test';
  2. const chai = require('chai');
  3. chai.use(require('chai-http'));
  4. const ModelPath = '../app/models/';
  5. const User = require(ModelPath + 'User.js');
  6. const Upload = require(ModelPath + 'Upload.js');
  7. const Key = require(ModelPath + 'Key.js');
  8. const Invite = require(ModelPath + 'Invite.js');
  9. const View = require(ModelPath + 'View.js');
  10. const Buffer = require('buffer').Buffer;
  11. const crypto = require('crypto');
  12. const fs = require('fs');
  13. const fsPromises = fs.promises;
  14. const path = require('path');
  15. //---------------- RESPONSE VERIFICATION ----------------//
  16. exports.verifyResponse = (res, status, message) => {
  17. res.should.have.status(status);
  18. res.body.should.be.a('object');
  19. res.body.should.have.property('message').equal(message);
  20. };
  21. exports.verifyResponseObj = (res, status, obj) => {
  22. res.should.have.status(status);
  23. res.body.should.deep.equal(obj);
  24. };
  25. //---------------- DATABASE UTIL ----------------//
  26. exports.clearDatabase = () =>
  27. Promise.all([
  28. User.deleteMany(),
  29. Invite.deleteMany(),
  30. Key.deleteMany(),
  31. Upload.deleteMany(),
  32. View.deleteMany()
  33. ]);
  34. exports.insertInvite = invite =>
  35. Invite.create(invite);
  36. exports.insertKey = key =>
  37. Key.create(key);
  38. exports.insertUpload = upload =>
  39. Upload.create(upload);
  40. exports.insertView = view =>
  41. View.create(view);
  42. exports.setBanned = (username, banned) =>
  43. User.updateOne({username: username}, {banned: banned});
  44. //---------------- API ROUTES ----------------//
  45. exports.login = (credentials, agent) =>
  46. agent.post('/api/auth/login')
  47. .send(credentials);
  48. exports.logout = agent =>
  49. agent.post('/api/auth/logout');
  50. exports.registerUser = (user, agent) =>
  51. agent.post('/api/auth/register')
  52. .send(user);
  53. exports.whoami = (agent, key) =>
  54. agent.get('/api/auth/whoami')
  55. .send({key: key});
  56. //---------------- TEST ENTRY CREATION ----------------//
  57. exports.createTestInvite = () =>
  58. exports.insertInvite({code: 'code', scope: ['file.upload'], issuer: 'Mocha'});
  59. exports.createTestInvites = (n) =>
  60. Promise.all(
  61. Array.from(new Array(n), (val, index) => 'code' + index)
  62. .map(code => exports.insertInvite({code: code, scope: ['file.upload'], issuer: 'Mocha'}))
  63. );
  64. exports.createTestUser = async agent => {
  65. await exports.createTestInvite();
  66. return exports.registerUser({displayname: 'user', password: 'pass', invite: 'code'}, agent);
  67. };
  68. exports.createTestSession = async agent => {
  69. await exports.createTestUser(agent);
  70. return exports.login({displayname: 'user', password: 'pass'}, agent);
  71. };
  72. exports.createSession = async (agent, scope, displayname) => {
  73. await exports.insertInvite({code: 'code', scope: scope, issuer: 'Mocha'});
  74. await exports.registerUser({displayname: displayname ? displayname : 'user', password: 'pass', invite: 'code'}, agent);
  75. await exports.login({displayname: displayname ? displayname : 'user', password: 'pass'}, agent);
  76. await Invite.deleteOne({code: 'code'});
  77. };
  78. exports.createTestFile = (size, name) =>
  79. fsPromises.writeFile(name, Buffer.allocUnsafe(size));
  80. exports.createTestKey = scope =>
  81. exports.insertKey({key: 'key', identifier: 'test', scope: scope, issuer: 'Mocha'});
  82. //---------------- FILESYSTEM ----------------//
  83. exports.deleteFile = file =>
  84. fsPromises.unlink(file);
  85. exports.fileExists = file =>
  86. fsPromises.access(file, fs.constants.R_OK);
  87. exports.fileSize = async file =>
  88. (await fsPromises.stat(file)).size;
  89. exports.fileHash = file =>
  90. new Promise((resolve, reject) => {
  91. const hash = crypto.createHash('MD5');
  92. fs.createReadStream(file)
  93. .on('error', reject)
  94. .on('data', chunk => hash.update(chunk))
  95. .on('end', () => resolve(hash.digest('hex')));
  96. });
  97. exports.bufferHash = buffer =>
  98. crypto.createHash('MD5')
  99. .update(buffer)
  100. .digest('hex');
  101. exports.directoryFileCount = async dir =>
  102. (await fsPromises.readdir(dir)).length;
  103. exports.clearDirectory = async dir => {
  104. const files = await fsPromises.readdir(dir);
  105. const promises = files.map(file => fsPromises.unlink(path.join(dir, file)));
  106. return Promise.all(promises);
  107. };
  108. //---------------- UPLOADS ----------------//
  109. exports.upload = (file, agent, key) => {
  110. const request = agent.post('/api/upload');
  111. if (key)
  112. request.field('key', key);
  113. return request.attach('file', file);
  114. };
  115. //---------------- Invites ----------------//
  116. exports.createInvite = (invite, agent) =>
  117. agent.post('/api/invites/create')
  118. .send(invite);
  119. exports.deleteInvite = (code, agent) =>
  120. agent.post('/api/invites/delete')
  121. .send({code: code});
  122. exports.getInvites = (query, agent) =>
  123. agent.get('/api/invites/get')
  124. .send(query);
  125. //---------------- Keys ----------------//
  126. exports.createKey = (key, agent) =>
  127. agent.post('/api/keys/create')
  128. .send(key);
  129. exports.deleteKey = (key, agent) =>
  130. agent.post('/api/keys/delete')
  131. .send({key: key});
  132. exports.getKeys = (query, agent) =>
  133. agent.get('/api/keys/get')
  134. .send(query);
  135. //---------------- Viewing ----------------//
  136. exports.binaryFileParser = (res, cb) => {
  137. res.setEncoding('binary');
  138. res.data = '';
  139. res.on("data", function (chunk) {
  140. res.data += chunk;
  141. });
  142. res.on('end', function () {
  143. cb(null, Buffer.from(res.data, 'binary'));
  144. });
  145. };
  146. exports.view = (id, agent) =>
  147. agent.get('/v/' + id)
  148. .buffer();
  149. //---------------- Users ----------------//
  150. exports.getUsers = (query, agent) =>
  151. agent.get('/api/users/get')
  152. .send(query);
  153. exports.ban = (username, agent) =>
  154. agent.post('/api/users/ban')
  155. .send({username: username});
  156. exports.unban = (username, agent) =>
  157. agent.post('/api/users/unban')
  158. .send({username: username});
  159. //---------------- Stats ----------------//
  160. exports.getStatsUploads = (query, agent) =>
  161. agent.get('/api/stats/uploads')
  162. .send(query);
  163. exports.getStatsViews = (query, agent) =>
  164. agent.get('/api/stats/views')
  165. .send(query);
  166. exports.getStatsWeek = agent =>
  167. agent.get('/api/stats/week');
  168. exports.getStatsAll = agent =>
  169. agent.get('/api/stats/all');