A simple file sharing site with an easy to use API and online panel.
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
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');