accounts.js 21 KB

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