A simple file sharing site with an easy to use API and online panel.
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

229 wiersze
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. .query({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({keyid: 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');