1
0

accounts.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. var should = require('should'),
  2. request = require('supertest'),
  3. app = require('../server.js'),
  4. Db = require('./db.js'),
  5. globalServer, token, hacker_token, account_id;
  6. describe('API /accounts', function() {
  7. before( function(done) {
  8. globalServer = app.listen();
  9. token = Db.get_user_token();
  10. hacker_token = Db.get_hacker_token();
  11. account_id = Db.ACCOUNT_ID;
  12. Db.init(done);
  13. });
  14. after( function() {
  15. globalServer.close();
  16. });
  17. describe('* Creation', function() {
  18. it('should create an account', function(done) {
  19. request(globalServer)
  20. .post('/api/accounts')
  21. .send({
  22. name: 'Home',
  23. reference: '1234567890'
  24. })
  25. .set('Authorization', 'JWT ' + token)
  26. .set('Accept', 'application/json')
  27. .expect(201)
  28. .expect('Content-Type', /json/)
  29. .end( function(error, result) {
  30. should.not.exist(error);
  31. var account = result.body;
  32. should.exist(account);
  33. account.name.should.be.equal('Home');
  34. account.reference.should.be.equal('1234567890');
  35. done();
  36. });
  37. });
  38. it('should fail to create account without params', function(done) {
  39. request(globalServer)
  40. .post('/api/accounts')
  41. .set('Authorization', 'JWT ' + token)
  42. .set('Accept', 'application/json')
  43. .expect(400)
  44. .expect('Content-Type', /json/)
  45. .end( function(error, result) {
  46. var errors = result.body;
  47. should.exist(errors);
  48. errors.should.be.instanceof(Array).and.have.lengthOf(1);
  49. var error = errors[0];
  50. error.field.should.be.equal('name');
  51. done();
  52. });
  53. });
  54. it('should fail to create account without valid token', function(done) {
  55. request(globalServer)
  56. .post('/api/accounts')
  57. .send({
  58. name: 'Home',
  59. reference: '1234567890'
  60. })
  61. .set('Authorization', 'JWT fake')
  62. .expect(401, done);
  63. });
  64. it('should fail to create account without token', function(done) {
  65. request(globalServer)
  66. .post('/api/accounts')
  67. .send({
  68. name: 'Home',
  69. reference: '1234567890'
  70. })
  71. .expect(401, done);
  72. });
  73. });
  74. describe('* Deletion', function() {
  75. it('should delete the given account', function(done) {
  76. request(globalServer)
  77. .post('/api/accounts')
  78. .send({
  79. name: 'Todelete',
  80. reference: '0987654321'
  81. })
  82. .set('Authorization', 'JWT ' + token)
  83. .end(function(error, result) {
  84. var account_to_delete_id = result.body._id;
  85. request(globalServer)
  86. .delete('/api/accounts/' + account_to_delete_id)
  87. .set('Authorization', 'JWT ' + token)
  88. .set('Accept', 'application/json')
  89. .expect(204, done);
  90. });
  91. });
  92. it('should fail to delete unknown account', function(done) {
  93. request(globalServer)
  94. .delete('/api/accounts/4fc67871349bb7bf6a000002')
  95. .set('Authorization', 'JWT ' + token)
  96. .expect(404, done);
  97. });
  98. it('should fail to delete invalid account', function(done) {
  99. request(globalServer)
  100. .delete('/api/accounts/1')
  101. .set('Authorization', 'JWT ' + token)
  102. .expect(404, done);
  103. });
  104. it('should fail to delete account for another user', function(done) {
  105. request(globalServer)
  106. .post('/api/accounts')
  107. .send({
  108. name: 'Todelete',
  109. reference: '0987654321'
  110. })
  111. .set('Authorization', 'JWT ' + token)
  112. .end(function(error, result) {
  113. var account_to_delete_id = result.body._id;
  114. request(globalServer)
  115. .delete('/api/accounts/' + account_to_delete_id)
  116. .set('Authorization', 'JWT ' + hacker_token)
  117. .expect(401, done);
  118. });
  119. });
  120. });
  121. describe('* Retrieve', function() {
  122. it('should retrieve the given account', function(done) {
  123. request(globalServer)
  124. .get('/api/accounts/' + account_id)
  125. .set('Authorization', 'JWT ' + token)
  126. .expect(200)
  127. .expect('Content-Type', /json/)
  128. .end( function(error, result) {
  129. should.not.exist(error);
  130. var account = result.body;
  131. should.exist(account);
  132. account.name.should.be.equal('Default');
  133. account.reference.should.be.equal('1234567890');
  134. done();
  135. })
  136. });
  137. it('should fail to retrieve an unknown account', function(done) {
  138. request(globalServer)
  139. .get('/api/accounts/4fc67871349bb7bf6a000002')
  140. .set('Authorization', 'JWT ' + token)
  141. .expect(404, done);
  142. });
  143. it('should fail to retrieve an invalid account', function(done) {
  144. request(globalServer)
  145. .get('/api/accounts/1')
  146. .set('Authorization', 'JWT ' + token)
  147. .expect(404, done);
  148. });
  149. it('should fail to retrieve the account for another user', function(done) {
  150. request(globalServer)
  151. .get('/api/accounts/' + account_id)
  152. .set('Authorization', 'JWT ' + hacker_token)
  153. .expect(401, done);
  154. });
  155. });
  156. describe('* Modify', function() {
  157. it('should modify the given account', function(done) {
  158. request(globalServer)
  159. .put('/api/accounts/' + account_id)
  160. .send( {
  161. name: 'Home 2',
  162. reference: '0987654321'
  163. })
  164. .set('Authorization', 'JWT ' + token)
  165. .expect(200)
  166. .expect('Content-Type', /json/)
  167. .end(function(error, result) {
  168. should.not.exist(error);
  169. var account = result.body;
  170. should.exist(account);
  171. account.name.should.be.equal('Home 2');
  172. account.reference.should.be.equal('0987654321');
  173. done();
  174. });
  175. });
  176. it('should fail to modify without arguments', function(done) {
  177. request(globalServer)
  178. .put('/api/accounts/' + account_id)
  179. .set('Authorization', 'JWT ' + token)
  180. .expect(400, done)
  181. });
  182. it('should fail to modify missing arguments', function(done) {
  183. request(globalServer)
  184. .put('/api/accounts/' + account_id)
  185. .send({reference: 'AZERTY'})
  186. .set('Authorization', 'JWT ' + token)
  187. .expect(400, done);
  188. });
  189. it('should fail to modify invalid account', function(done) {
  190. request(globalServer)
  191. .put('/api/accounts/1')
  192. .set('Authorization', 'JWT ' + token)
  193. .expect(404, done)
  194. });
  195. it('should fail to modify account for another user', function(done) {
  196. request(globalServer)
  197. .put('/api/accounts/' + account_id)
  198. .set('Authorization', 'JWT ' + hacker_token)
  199. .expect(401, done)
  200. });
  201. });
  202. describe('* Entries', function() {
  203. describe('* Creation', function() {
  204. it('should create an entry with minimal data (DEPOSIT)' , function(done) {
  205. request(globalServer)
  206. .post('/api/accounts/' + account_id + '/entries')
  207. .send({
  208. amount: 1000,
  209. date: new Date('2015-08-14')
  210. })
  211. .set('Authorization', 'JWT ' + token)
  212. .expect(201)
  213. .expect('Content-Type', /json/)
  214. .end(function(error, result) {
  215. should.not.exist(error);
  216. var entry = result.body.entry;
  217. should.exist(entry);
  218. entry.amount.should.be.equal(1000);
  219. new Date(entry.date).should.eql(new Date(2015, 7, 14));
  220. entry.type.should.be.equal('DEPOSIT');
  221. should.not.exist(entry.category);
  222. should.not.exist(entry.sub_category);
  223. var entries = result.body.entries;
  224. should.exist(entries);
  225. entries.should.be.instanceof(Array).and.have.lengthOf(2);
  226. new Date(entries[0].date).should.eql(new Date('2015-08-14'))
  227. entries[0].type.should.be.equal('DEPOSIT');
  228. entries[0].amount.should.be.equal(1000);
  229. done();
  230. });
  231. });
  232. it('should create an entry with minimal data (BILL)' , function(done) {
  233. request(globalServer)
  234. .post('/api/accounts/' + account_id + '/entries')
  235. .send({
  236. label: 'test',
  237. amount: -1000,
  238. date: new Date('2015-08-15')
  239. })
  240. .set('Authorization', 'JWT ' + token)
  241. .expect(201)
  242. .expect('Content-Type', /json/)
  243. .end(function(error, result) {
  244. should.not.exist(error);
  245. var entry = result.body.entry;
  246. should.exist(entry);
  247. entry.amount.should.be.equal(-1000);
  248. new Date(entry.date).should.eql(new Date(2015, 7, 15));
  249. entry.type.should.be.equal('BILL');
  250. should.not.exist(entry.category);
  251. should.not.exist(entry.sub_category);
  252. var entries = result.body.entries;
  253. should.exist(entries);
  254. entries.should.be.instanceof(Array).and.have.lengthOf(3);
  255. new Date(entries[0].date).should.eql(new Date('2015-08-15'))
  256. entries[0].type.should.be.equal('BILL');
  257. entries[0].amount.should.be.equal(-1000);
  258. done();
  259. });
  260. });
  261. it('should fail to create entry without data', function(done) {
  262. request(globalServer)
  263. .post('/api/accounts/' + account_id + '/entries')
  264. .set('Authorization', 'JWT ' + token)
  265. .expect(400, done);
  266. });
  267. it('should fail to create entry for not owned account', function(done) {
  268. request(globalServer)
  269. .post('/api/accounts/' + account_id + '/entries')
  270. .set('Authorization', 'JWT ' + hacker_token)
  271. .send({
  272. label: 'test',
  273. amount: -1000,
  274. date: new Date('2014-12-08')
  275. })
  276. .expect(401, done);
  277. });
  278. it('should fail to create entry for not valid account', function(done) {
  279. request(globalServer)
  280. .post('/api/accounts/1/entries')
  281. .send({
  282. label: 'test',
  283. amount: -1000,
  284. date: new Date('2014-12-08')
  285. })
  286. .set('Authorization', 'JWT ' + token)
  287. .expect(404, done);
  288. });
  289. it('should fail to create entry for unknown account', function(done) {
  290. request(globalServer)
  291. .post('/api/accounts/' + token + '/entries')
  292. .send({
  293. label: 'test',
  294. amount: -1000,
  295. date: new Date('2014-12-08')
  296. })
  297. .set('Authorization', 'JWT ' + token)
  298. .expect(404, done);
  299. });
  300. });
  301. describe('* Modify', function() {
  302. it('should modify the given entry', function(done) {
  303. request(globalServer)
  304. .post('/api/accounts/' + account_id + '/entries')
  305. .send({
  306. label: 'test',
  307. amount: 50,
  308. date: new Date('2014-12-08')
  309. })
  310. .set('Authorization', 'JWT ' + token)
  311. .end(function(error, result) {
  312. var entry_id = result.body.entry._id;
  313. request(globalServer)
  314. .put('/api/accounts/' + account_id + '/entries/' + entry_id)
  315. .send({
  316. label: 'modified',
  317. amount: 55,
  318. date: new Date('2014-12-09')
  319. })
  320. .set('Authorization', 'JWT ' + token)
  321. .expect(200)
  322. .expect('Content-Type', /json/)
  323. .end( function(errors, result) {
  324. should.not.exist(errors);
  325. var entry = result.body.entry;
  326. should.exist(entry);
  327. entry.label.should.be.equal('modified');
  328. entry.amount.should.be.equal(55);
  329. new Date(entry.date).should.eql(new Date(2014,11,9));
  330. var entries = result.body.entries;
  331. should.exist(entries);
  332. entries.should.be.instanceof(Array);
  333. done();
  334. });
  335. });
  336. });
  337. it('should fail to modify the given entry without data', function(done) {
  338. request(globalServer)
  339. .post('/api/accounts/' + account_id + '/entries')
  340. .send({
  341. label: 'test',
  342. amount: 50,
  343. date: new Date('2014-12-08')
  344. })
  345. .set('Authorization', 'JWT ' + token)
  346. .end(function(error, result) {
  347. var entry_id = result.body.entry._id;
  348. request(globalServer)
  349. .put('/api/accounts/' + account_id + '/entries/' + entry_id)
  350. .set('Authorization', 'JWT ' + token)
  351. .expect(400, done);
  352. });
  353. });
  354. it('should fail to modify unknown entry', function(done) {
  355. request(globalServer)
  356. .post('/api/accounts/' + account_id + '/entries')
  357. .send({
  358. label: 'test',
  359. amount: 50,
  360. date: new Date('2014-12-08')
  361. })
  362. .set('Authorization', 'JWT ' + token)
  363. .end(function(error, result) {
  364. request(globalServer)
  365. .put('/api/accounts/' + account_id + '/entries/' + token)
  366. .send({
  367. label: 'modified',
  368. amount: 55,
  369. date: new Date('2014-12-09')
  370. })
  371. .set('Authorization', 'JWT ' + token)
  372. .expect(404, done);
  373. });
  374. });
  375. it('should fail to modify invalid entry', function(done) {
  376. request(globalServer)
  377. .post('/api/accounts/' + account_id + '/entries')
  378. .send({
  379. label: 'test',
  380. amount: 50,
  381. date: new Date('2014-12-08')
  382. })
  383. .set('Authorization', 'JWT ' + token)
  384. .end(function(error, result) {
  385. var entry_id = result.body._id;
  386. request(globalServer)
  387. .put('/api/accounts/' + account_id + '/entries/1')
  388. .send({
  389. label: 'modified',
  390. amount: 55,
  391. date: new Date('2014-12-09')
  392. })
  393. .set('Authorization', 'JWT ' + token)
  394. .expect(404, done);
  395. });
  396. });
  397. it('should fail to modify the given entry for unknown account', function(done) {
  398. request(globalServer)
  399. .post('/api/accounts/' + account_id + '/entries')
  400. .send({
  401. label: 'test',
  402. amount: 50,
  403. date: new Date('2014-12-08')
  404. })
  405. .set('Authorization', 'JWT ' + token)
  406. .end(function(error, result) {
  407. var entry_id = result.body._id;
  408. request(globalServer)
  409. .put('/api/accounts/' + token + '/entries/' + entry_id)
  410. .send({
  411. label: 'modified',
  412. amount: 55,
  413. date: new Date('2014-12-09')
  414. })
  415. .set('Authorization', 'JWT ' + token)
  416. .expect(404, done);
  417. });
  418. });
  419. it('should fail to modify the given entry for invalid account', function(done) {
  420. request(globalServer)
  421. .post('/api/accounts/' + account_id + '/entries')
  422. .send({
  423. label: 'test',
  424. amount: 50,
  425. date: new Date('2014-12-08')
  426. })
  427. .set('Authorization', 'JWT ' + token)
  428. .end(function(error, result) {
  429. var entry_id = result.body._id;
  430. request(globalServer)
  431. .put('/api/accounts/1/entries/' + entry_id)
  432. .send({
  433. label: 'modified',
  434. amount: 55,
  435. date: new Date('2014-12-09')
  436. })
  437. .set('Authorization', 'JWT ' + token)
  438. .expect(404, done);
  439. });
  440. });
  441. it('should fail to modify the given not owned entry', function(done) {
  442. request(globalServer)
  443. .post('/api/accounts/' + account_id + '/entries')
  444. .send({
  445. label: 'test',
  446. amount: 50,
  447. date: new Date('2014-12-08')
  448. })
  449. .set('Authorization', 'JWT ' + token)
  450. .end(function(error, result) {
  451. var entry_id = result.body._id;
  452. request(globalServer)
  453. .put('/api/accounts/' + account_id + '/entries/' + entry_id)
  454. .send({
  455. label: 'modified',
  456. amount: 55,
  457. date: new Date('2014-12-09')
  458. })
  459. .set('Authorization', 'JWT ' + hacker_token)
  460. .expect(401, done);
  461. });
  462. });
  463. });
  464. describe('* Deletion', function() {
  465. it('should delete the given entry', function(done) {
  466. request(globalServer)
  467. .post('/api/accounts/' + account_id + '/entries')
  468. .send({
  469. label: 'test',
  470. amount: 50,
  471. date: new Date('2014-12-08')
  472. })
  473. .set('Authorization', 'JWT ' + token)
  474. .end(function(error, result) {
  475. var entry_id = result.body.entry._id;
  476. request(globalServer)
  477. .delete('/api/accounts/' + account_id + '/entries/' + entry_id)
  478. .set('Authorization', 'JWT ' + token)
  479. .expect(204, done);
  480. });
  481. });
  482. it('should fail to delete an unknown entry', function(done) {
  483. request(globalServer)
  484. .delete('/api/accounts/' + account_id + '/entries/' + token)
  485. .set('Authorization', 'JWT ' + token)
  486. .expect(404, done);
  487. });
  488. it('should fail to delete an invalid entry', function(done) {
  489. request(globalServer)
  490. .delete('/api/accounts/' + account_id + '/entries/1')
  491. .set('Authorization', 'JWT ' + token)
  492. .expect(404, done);
  493. });
  494. it('should fail to delete the not owned given entry', function(done) {
  495. request(globalServer)
  496. .post('/api/accounts/' + account_id + '/entries')
  497. .send({
  498. label: 'test',
  499. amount: 50,
  500. date: new Date('2014-12-08')
  501. })
  502. .set('Authorization', 'JWT ' + token)
  503. .end(function(error, result) {
  504. var entry_id = result.body.entry._id;
  505. request(globalServer)
  506. .delete('/api/accounts/' + account_id + '/entries/' + entry_id)
  507. .set('Authorization', 'JWT ' + hacker_token)
  508. .expect(401, done);
  509. });
  510. });
  511. });
  512. });
  513. });