accounts.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  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. should.exist(result.body.balance);
  230. done();
  231. });
  232. });
  233. it('should create an entry with minimal data (BILL)' , function(done) {
  234. request(globalServer)
  235. .post('/api/accounts/' + account_id + '/entries')
  236. .send({
  237. label: 'test',
  238. amount: -1000,
  239. date: new Date('2015-08-15')
  240. })
  241. .set('Authorization', 'JWT ' + token)
  242. .expect(201)
  243. .expect('Content-Type', /json/)
  244. .end(function(error, result) {
  245. should.not.exist(error);
  246. var entry = result.body.entry;
  247. should.exist(entry);
  248. entry.amount.should.be.equal(-1000);
  249. new Date(entry.date).should.eql(new Date(2015, 7, 15));
  250. entry.type.should.be.equal('BILL');
  251. should.not.exist(entry.category);
  252. should.not.exist(entry.sub_category);
  253. var entries = result.body.entries;
  254. should.exist(entries);
  255. entries.should.be.instanceof(Array).and.have.lengthOf(3);
  256. new Date(entries[0].date).should.eql(new Date('2015-08-15'))
  257. entries[0].type.should.be.equal('BILL');
  258. entries[0].amount.should.be.equal(-1000);
  259. should.exist(result.body.balance);
  260. done();
  261. });
  262. });
  263. it('should fail to create entry without data', function(done) {
  264. request(globalServer)
  265. .post('/api/accounts/' + account_id + '/entries')
  266. .set('Authorization', 'JWT ' + token)
  267. .expect(400, done);
  268. });
  269. it('should fail to create entry for not owned account', function(done) {
  270. request(globalServer)
  271. .post('/api/accounts/' + account_id + '/entries')
  272. .set('Authorization', 'JWT ' + hacker_token)
  273. .send({
  274. label: 'test',
  275. amount: -1000,
  276. date: new Date('2014-12-08')
  277. })
  278. .expect(401, done);
  279. });
  280. it('should fail to create entry for not valid account', function(done) {
  281. request(globalServer)
  282. .post('/api/accounts/1/entries')
  283. .send({
  284. label: 'test',
  285. amount: -1000,
  286. date: new Date('2014-12-08')
  287. })
  288. .set('Authorization', 'JWT ' + token)
  289. .expect(404, done);
  290. });
  291. it('should fail to create entry for unknown account', function(done) {
  292. request(globalServer)
  293. .post('/api/accounts/' + token + '/entries')
  294. .send({
  295. label: 'test',
  296. amount: -1000,
  297. date: new Date('2014-12-08')
  298. })
  299. .set('Authorization', 'JWT ' + token)
  300. .expect(404, done);
  301. });
  302. });
  303. describe('* Modify', function() {
  304. it('should modify the given entry', function(done) {
  305. request(globalServer)
  306. .post('/api/accounts/' + account_id + '/entries')
  307. .send({
  308. label: 'test',
  309. amount: 50,
  310. date: new Date('2014-12-08')
  311. })
  312. .set('Authorization', 'JWT ' + token)
  313. .end(function(error, result) {
  314. var entry_id = result.body.entry._id;
  315. request(globalServer)
  316. .put('/api/accounts/' + account_id + '/entries/' + entry_id)
  317. .send({
  318. label: 'modified',
  319. amount: 55,
  320. date: new Date('2014-12-09')
  321. })
  322. .set('Authorization', 'JWT ' + token)
  323. .expect(200)
  324. .expect('Content-Type', /json/)
  325. .end( function(errors, result) {
  326. should.not.exist(errors);
  327. var entry = result.body.entry;
  328. should.exist(entry);
  329. entry.label.should.be.equal('modified');
  330. entry.amount.should.be.equal(55);
  331. new Date(entry.date).should.eql(new Date(2014,11,9));
  332. var entries = result.body.entries;
  333. should.exist(entries);
  334. entries.should.be.instanceof(Array);
  335. should.exist(result.body.balance);
  336. done();
  337. });
  338. });
  339. });
  340. it('should fail to modify the given entry without data', function(done) {
  341. request(globalServer)
  342. .post('/api/accounts/' + account_id + '/entries')
  343. .send({
  344. label: 'test',
  345. amount: 50,
  346. date: new Date('2014-12-08')
  347. })
  348. .set('Authorization', 'JWT ' + token)
  349. .end(function(error, result) {
  350. var entry_id = result.body.entry._id;
  351. request(globalServer)
  352. .put('/api/accounts/' + account_id + '/entries/' + entry_id)
  353. .set('Authorization', 'JWT ' + token)
  354. .expect(400, done);
  355. });
  356. });
  357. it('should fail to modify unknown entry', function(done) {
  358. request(globalServer)
  359. .post('/api/accounts/' + account_id + '/entries')
  360. .send({
  361. label: 'test',
  362. amount: 50,
  363. date: new Date('2014-12-08')
  364. })
  365. .set('Authorization', 'JWT ' + token)
  366. .end(function(error, result) {
  367. request(globalServer)
  368. .put('/api/accounts/' + account_id + '/entries/' + token)
  369. .send({
  370. label: 'modified',
  371. amount: 55,
  372. date: new Date('2014-12-09')
  373. })
  374. .set('Authorization', 'JWT ' + token)
  375. .expect(404, done);
  376. });
  377. });
  378. it('should fail to modify invalid entry', function(done) {
  379. request(globalServer)
  380. .post('/api/accounts/' + account_id + '/entries')
  381. .send({
  382. label: 'test',
  383. amount: 50,
  384. date: new Date('2014-12-08')
  385. })
  386. .set('Authorization', 'JWT ' + token)
  387. .end(function(error, result) {
  388. var entry_id = result.body._id;
  389. request(globalServer)
  390. .put('/api/accounts/' + account_id + '/entries/1')
  391. .send({
  392. label: 'modified',
  393. amount: 55,
  394. date: new Date('2014-12-09')
  395. })
  396. .set('Authorization', 'JWT ' + token)
  397. .expect(404, done);
  398. });
  399. });
  400. it('should fail to modify the given entry for unknown account', function(done) {
  401. request(globalServer)
  402. .post('/api/accounts/' + account_id + '/entries')
  403. .send({
  404. label: 'test',
  405. amount: 50,
  406. date: new Date('2014-12-08')
  407. })
  408. .set('Authorization', 'JWT ' + token)
  409. .end(function(error, result) {
  410. var entry_id = result.body._id;
  411. request(globalServer)
  412. .put('/api/accounts/' + token + '/entries/' + entry_id)
  413. .send({
  414. label: 'modified',
  415. amount: 55,
  416. date: new Date('2014-12-09')
  417. })
  418. .set('Authorization', 'JWT ' + token)
  419. .expect(404, done);
  420. });
  421. });
  422. it('should fail to modify the given entry for invalid account', function(done) {
  423. request(globalServer)
  424. .post('/api/accounts/' + account_id + '/entries')
  425. .send({
  426. label: 'test',
  427. amount: 50,
  428. date: new Date('2014-12-08')
  429. })
  430. .set('Authorization', 'JWT ' + token)
  431. .end(function(error, result) {
  432. var entry_id = result.body._id;
  433. request(globalServer)
  434. .put('/api/accounts/1/entries/' + entry_id)
  435. .send({
  436. label: 'modified',
  437. amount: 55,
  438. date: new Date('2014-12-09')
  439. })
  440. .set('Authorization', 'JWT ' + token)
  441. .expect(404, done);
  442. });
  443. });
  444. it('should fail to modify the given not owned entry', function(done) {
  445. request(globalServer)
  446. .post('/api/accounts/' + account_id + '/entries')
  447. .send({
  448. label: 'test',
  449. amount: 50,
  450. date: new Date('2014-12-08')
  451. })
  452. .set('Authorization', 'JWT ' + token)
  453. .end(function(error, result) {
  454. var entry_id = result.body._id;
  455. request(globalServer)
  456. .put('/api/accounts/' + account_id + '/entries/' + entry_id)
  457. .send({
  458. label: 'modified',
  459. amount: 55,
  460. date: new Date('2014-12-09')
  461. })
  462. .set('Authorization', 'JWT ' + hacker_token)
  463. .expect(401, done);
  464. });
  465. });
  466. });
  467. describe('* Deletion', function() {
  468. it('should delete the given entry', function(done) {
  469. request(globalServer)
  470. .post('/api/accounts/' + account_id + '/entries')
  471. .send({
  472. label: 'test',
  473. amount: 50,
  474. date: new Date('2014-12-08')
  475. })
  476. .set('Authorization', 'JWT ' + token)
  477. .end(function(error, result) {
  478. var entry_id = result.body.entry._id;
  479. request(globalServer)
  480. .delete('/api/accounts/' + account_id + '/entries/' + entry_id)
  481. .set('Authorization', 'JWT ' + token)
  482. .expect(200)
  483. .end(function(error, result) {
  484. should.exist(result.body.balance);
  485. done();
  486. });
  487. });
  488. });
  489. it('should fail to delete an unknown entry', function(done) {
  490. request(globalServer)
  491. .delete('/api/accounts/' + account_id + '/entries/' + token)
  492. .set('Authorization', 'JWT ' + token)
  493. .expect(404, done);
  494. });
  495. it('should fail to delete an invalid entry', function(done) {
  496. request(globalServer)
  497. .delete('/api/accounts/' + account_id + '/entries/1')
  498. .set('Authorization', 'JWT ' + token)
  499. .expect(404, done);
  500. });
  501. it('should fail to delete the not owned given entry', function(done) {
  502. request(globalServer)
  503. .post('/api/accounts/' + account_id + '/entries')
  504. .send({
  505. label: 'test',
  506. amount: 50,
  507. date: new Date('2014-12-08')
  508. })
  509. .set('Authorization', 'JWT ' + token)
  510. .end(function(error, result) {
  511. var entry_id = result.body.entry._id;
  512. request(globalServer)
  513. .delete('/api/accounts/' + account_id + '/entries/' + entry_id)
  514. .set('Authorization', 'JWT ' + hacker_token)
  515. .expect(401, done);
  516. });
  517. });
  518. });
  519. });
  520. });