fruits-test.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. /* eslint-disable no-undef */
  2. 'use strict';
  3. const assert = require('assert');
  4. const supertest = require('supertest');
  5. const proxyquire = require('proxyquire');
  6. const mockDb = {
  7. init: () => {
  8. return Promise.resolve();
  9. }
  10. };
  11. describe('Fruits', () => {
  12. it('get all', async () => {
  13. const mockApi = {
  14. findAll: () => Promise.resolve({ rows: [{ id: 1 }] })
  15. };
  16. // Mock the nested require
  17. const routesStub = proxyquire('../lib/routes/fruits', {
  18. '../api/fruits': mockApi
  19. });
  20. const app = proxyquire('../app', {
  21. './lib/db': mockDb,
  22. './lib/routes/fruits': routesStub
  23. });
  24. const { body } = await supertest(app)
  25. .get('/api/fruits')
  26. .expect('Content-Type', /json/)
  27. .expect(200);
  28. assert.strictEqual(Array.isArray(body), true);
  29. assert.strictEqual(body.length, 1);
  30. });
  31. it('get all error', async () => {
  32. const mockApi = {
  33. findAll: () => Promise.reject(new Error('error'))
  34. };
  35. // Mock the nested require
  36. const routesStub = proxyquire('../lib/routes/fruits', {
  37. '../api/fruits': mockApi
  38. });
  39. const app = proxyquire('../app', {
  40. './lib/db': mockDb,
  41. './lib/routes/fruits': routesStub
  42. });
  43. const response = await supertest(app)
  44. .get('/api/fruits')
  45. .expect(400);
  46. assert.strictEqual(response.statusCode, 400);
  47. });
  48. it('get one', async () => {
  49. const mockApi = {
  50. find: id => {
  51. assert.strictEqual(id, '1');
  52. return Promise.resolve({ rows: [{ id }] });
  53. }
  54. };
  55. // Mock the nested require
  56. const routesStub = proxyquire('../lib/routes/fruits', {
  57. '../api/fruits': mockApi
  58. });
  59. const app = proxyquire('../app', {
  60. './lib/db': mockDb,
  61. './lib/routes/fruits': routesStub
  62. });
  63. const { body } = await supertest(app)
  64. .get('/api/fruits/1')
  65. .expect('Content-Type', /json/)
  66. .expect(200);
  67. assert.strictEqual(Array.isArray(body), false);
  68. assert.strictEqual(body.id, '1');
  69. });
  70. it('get one - return 404', async () => {
  71. const mockApi = {
  72. find: () => Promise.resolve({ rowCount: 0 })
  73. };
  74. // Mock the nested require
  75. const routesStub = proxyquire('../lib/routes/fruits', {
  76. '../api/fruits': mockApi
  77. });
  78. const app = proxyquire('../app', {
  79. './lib/db': mockDb,
  80. './lib/routes/fruits': routesStub
  81. });
  82. const response = await supertest(app)
  83. .get('/api/fruits/1')
  84. .expect(404);
  85. assert.strictEqual(response.text, 'Item 1 not found');
  86. });
  87. it('get one - error', async () => {
  88. const mockApi = {
  89. find: () => Promise.reject(new Error('error'))
  90. };
  91. // Mock the nested require
  92. const routesStub = proxyquire('../lib/routes/fruits', {
  93. '../api/fruits': mockApi
  94. });
  95. const app = proxyquire('../app', {
  96. './lib/db': mockDb,
  97. './lib/routes/fruits': routesStub
  98. });
  99. const response = await supertest(app)
  100. .get('/api/fruits/1')
  101. .expect(400);
  102. assert.strictEqual(response.statusCode, 400);
  103. });
  104. it('post', async () => {
  105. const fruitData = {
  106. name: 'Banana',
  107. stock: 10
  108. };
  109. const mockApi = {
  110. create: (name, stock) => {
  111. assert.strictEqual(name, fruitData.name);
  112. assert.strictEqual(stock, fruitData.stock);
  113. return Promise.resolve({ rows: [] });
  114. }
  115. };
  116. // Mock the nested require
  117. const routesStub = proxyquire('../lib/routes/fruits', {
  118. '../api/fruits': mockApi
  119. });
  120. const app = proxyquire('../app', {
  121. './lib/db': mockDb,
  122. './lib/routes/fruits': routesStub
  123. });
  124. const response = await supertest(app)
  125. .post('/api/fruits')
  126. .send(fruitData)
  127. .expect(201);
  128. assert.strictEqual(response.statusCode, 201);
  129. });
  130. it('post - error - no name', async () => {
  131. const fruitData = {
  132. stock: 10
  133. };
  134. const app = proxyquire('../app', {
  135. './lib/db': mockDb
  136. });
  137. const response = await supertest(app)
  138. .post('/api/fruits')
  139. .send(fruitData)
  140. .expect(422);
  141. assert.strictEqual(response.statusCode, 422);
  142. assert.strictEqual(response.text, 'The name is required!');
  143. });
  144. it('post - error - no stock', async () => {
  145. const fruitData = {
  146. name: 'Banana'
  147. };
  148. const app = proxyquire('../app', {
  149. './lib/db': mockDb
  150. });
  151. const response = await supertest(app)
  152. .post('/api/fruits')
  153. .send(fruitData)
  154. .expect(422);
  155. assert.strictEqual(response.statusCode, 422);
  156. assert.strictEqual(response.text, 'The stock must be greater or equal to 0!');
  157. });
  158. it('post - error - id error', async () => {
  159. const app = proxyquire('../app', {
  160. './lib/db': mockDb
  161. });
  162. const response = await supertest(app)
  163. .post('/api/fruits')
  164. .send({ name: 'Banana', stock: 10, id: 22 })
  165. .expect(422);
  166. assert.strictEqual(response.statusCode, 422);
  167. assert.strictEqual(response.text, 'Id was invalidly set on request.');
  168. });
  169. it('post - error', async () => {
  170. const fruitData = {
  171. name: 'Banana',
  172. stock: 10
  173. };
  174. const mockApi = {
  175. create: () => {
  176. return Promise.reject(new Error('error'));
  177. }
  178. };
  179. // Mock the nested require
  180. const routesStub = proxyquire('../lib/routes/fruits', {
  181. '../api/fruits': mockApi
  182. });
  183. const app = proxyquire('../app', {
  184. './lib/db': mockDb,
  185. './lib/routes/fruits': routesStub
  186. });
  187. const response = await supertest(app)
  188. .post('/api/fruits')
  189. .send(fruitData)
  190. .expect(400);
  191. assert.strictEqual(response.statusCode, 400);
  192. });
  193. it('post - error - id error', async () => {
  194. const app = proxyquire('../app', {
  195. './lib/db': mockDb
  196. });
  197. const response = await supertest(app)
  198. .post('/api/fruits')
  199. .send({ name: 'Banana', stock: 10, id: 22 })
  200. .expect(422);
  201. assert.strictEqual(response.statusCode, 422);
  202. assert.strictEqual(response.text, 'Id was invalidly set on request.');
  203. });
  204. it('post - error - no payload', async () => {
  205. const app = proxyquire('../app', {
  206. './lib/db': mockDb
  207. });
  208. const response = await supertest(app)
  209. .post('/api/fruits')
  210. .expect(415);
  211. assert.strictEqual(response.statusCode, 415);
  212. assert.strictEqual(response.text, 'Invalid payload!');
  213. });
  214. it('post - error - invalid payload', async () => {
  215. const app = proxyquire('../app', {
  216. './lib/db': mockDb
  217. });
  218. const response = await supertest(app)
  219. .post('/api/fruits')
  220. .set('Content-Type', 'application/json')
  221. .send('Some text')
  222. .expect(415);
  223. assert.strictEqual(response.statusCode, 415);
  224. assert.strictEqual(response.text, 'Invalid payload!');
  225. });
  226. it('post - error - xml payload', async () => {
  227. const app = proxyquire('../app', {
  228. './lib/db': mockDb
  229. });
  230. const xmlFruitData = '<?xml version="1.0" encoding="UTF-8"?><fruit><name>Banana</name><stock>10</stock></fruit>';
  231. const response = await supertest(app)
  232. .post('/api/fruits')
  233. .set('Content-Type', 'application/xml')
  234. .send(xmlFruitData)
  235. .expect(415);
  236. assert.strictEqual(response.statusCode, 415);
  237. assert.strictEqual(response.text, 'Invalid payload!');
  238. });
  239. it('post - error - JSON Content-Type and XML body', async () => {
  240. const app = proxyquire('../app', {
  241. './lib/db': mockDb
  242. });
  243. const xmlFruitData = '<?xml version="1.0" encoding="UTF-8"?><fruit><name>adam</name><stock>10</stock></fruit>';
  244. const response = await supertest(app)
  245. .post('/api/fruits')
  246. .set('Content-Type', 'application/json')
  247. .send(xmlFruitData)
  248. .expect(415);
  249. assert.strictEqual(response.statusCode, 415);
  250. assert.strictEqual(response.text, 'Invalid payload!');
  251. });
  252. it('post - error - negative number of stock', async () => {
  253. const fruitData = {
  254. name: 'Banana',
  255. stock: -10
  256. };
  257. const app = proxyquire('../app', {
  258. './lib/db': mockDb
  259. });
  260. const response = await supertest(app)
  261. .post('/api/fruits')
  262. .send(fruitData)
  263. .expect(422);
  264. assert.strictEqual(response.statusCode, 422);
  265. assert.strictEqual(response.text, 'The stock must be greater or equal to 0!');
  266. });
  267. it('post - error - no numeric stock', async () => {
  268. const fruitData = {
  269. name: 'Banana',
  270. stock: 'two'
  271. };
  272. const app = proxyquire('../app', {
  273. './lib/db': mockDb
  274. });
  275. const response = await supertest(app)
  276. .post('/api/fruits')
  277. .send(fruitData)
  278. .expect(422);
  279. assert.strictEqual(response.statusCode, 422);
  280. assert.strictEqual(response.text, 'The stock must be greater or equal to 0!');
  281. });
  282. it('put', async () => {
  283. const fruitData = {
  284. name: 'Banana',
  285. stock: 10,
  286. id: '20'
  287. };
  288. const mockApi = {
  289. update: options => {
  290. assert.strictEqual(options.name, fruitData.name);
  291. assert.strictEqual(options.stock, fruitData.stock);
  292. assert.strictEqual(options.id, fruitData.id);
  293. return Promise.resolve({ rowCount: 1 });
  294. }
  295. };
  296. // Mock the nested require
  297. const routesStub = proxyquire('../lib/routes/fruits', {
  298. '../api/fruits': mockApi
  299. });
  300. const app = proxyquire('../app', {
  301. './lib/db': mockDb,
  302. './lib/routes/fruits': routesStub
  303. });
  304. const response = await supertest(app)
  305. .put('/api/fruits/20')
  306. .send(fruitData)
  307. .expect(204);
  308. assert.strictEqual(response.statusCode, 204);
  309. });
  310. it('put - error - no name', async () => {
  311. const fruitData = {
  312. stock: 10
  313. };
  314. const app = proxyquire('../app', {
  315. './lib/db': mockDb
  316. });
  317. const response = await supertest(app)
  318. .put('/api/fruits/20')
  319. .expect(422)
  320. .send(fruitData);
  321. assert.strictEqual(response.statusCode, 422);
  322. assert.strictEqual(response.text, 'The name is required!');
  323. });
  324. it('put - error - no stock', async () => {
  325. const app = proxyquire('../app', {
  326. './lib/db': mockDb
  327. });
  328. const response = await supertest(app)
  329. .put('/api/fruits/20')
  330. .send({ name: 'name' })
  331. .expect(422);
  332. assert.strictEqual(response.statusCode, 422);
  333. assert.strictEqual(response.text, 'The stock must be greater or equal to 0!');
  334. });
  335. it('put - error - id error', async () => {
  336. const app = proxyquire('../app', {
  337. './lib/db': mockDb
  338. });
  339. const response = await supertest(app)
  340. .put('/api/fruits/20')
  341. .send({ name: 'Banana', stock: 10, id: '22' })
  342. .expect(422);
  343. assert.strictEqual(response.statusCode, 422);
  344. assert.strictEqual(response.text, 'Id was invalidly set on request.');
  345. });
  346. it('put - error - not found', async () => {
  347. const fruitData = {
  348. name: 'Banana',
  349. stock: 10,
  350. id: '20'
  351. };
  352. const mockApi = {
  353. update: () => {
  354. return Promise.resolve({ rowCount: 0 });
  355. }
  356. };
  357. // Mock the nested require
  358. const routesStub = proxyquire('../lib/routes/fruits', {
  359. '../api/fruits': mockApi
  360. });
  361. const app = proxyquire('../app', {
  362. './lib/db': mockDb,
  363. './lib/routes/fruits': routesStub
  364. });
  365. const response = await supertest(app)
  366. .put('/api/fruits/20')
  367. .send(fruitData)
  368. .expect(404);
  369. assert.strictEqual(response.statusCode, 404);
  370. assert.strictEqual(response.text, 'Unknown item 20');
  371. });
  372. it('put - error', async () => {
  373. const fruitData = {
  374. name: 'Banana',
  375. stock: 10,
  376. id: '22'
  377. };
  378. const mockApi = {
  379. update: () => {
  380. return Promise.reject(new Error('error'));
  381. }
  382. };
  383. // Mock the nested require
  384. const routesStub = proxyquire('../lib/routes/fruits', {
  385. '../api/fruits': mockApi
  386. });
  387. const app = proxyquire('../app', {
  388. './lib/db': mockDb,
  389. './lib/routes/fruits': routesStub
  390. });
  391. const response = await supertest(app)
  392. .put('/api/fruits/22')
  393. .send(fruitData)
  394. .expect(400);
  395. assert.strictEqual(response.statusCode, 400);
  396. });
  397. it('put - error - no payload', async () => {
  398. const app = proxyquire('../app', {
  399. './lib/db': mockDb
  400. });
  401. const response = await supertest(app)
  402. .put('/api/fruits/20')
  403. .expect(415);
  404. assert.strictEqual(response.statusCode, 415);
  405. assert.strictEqual(response.text, 'Invalid payload!');
  406. });
  407. it('put - error - invalid payload', async () => {
  408. const app = proxyquire('../app', {
  409. './lib/db': mockDb
  410. });
  411. const response = await supertest(app)
  412. .put('/api/fruits/20')
  413. .set('Content-Type', 'application/json')
  414. .send('Some text')
  415. .expect(415);
  416. assert.strictEqual(response.statusCode, 415);
  417. assert.strictEqual(response.text, 'Invalid payload!');
  418. });
  419. it('put - error - xml payload', async () => {
  420. const app = proxyquire('../app', {
  421. './lib/db': mockDb
  422. });
  423. const xmlFruitData = '<?xml version="1.0" encoding="UTF-8"?><fruit><name>Banana</name><stock>10</stock></fruit>';
  424. const response = await supertest(app)
  425. .put('/api/fruits/10')
  426. .set('Content-Type', 'application/xml')
  427. .send(xmlFruitData)
  428. .expect(415);
  429. assert.strictEqual(response.statusCode, 415);
  430. assert.strictEqual(response.text, 'Invalid payload!');
  431. });
  432. it('put - error - JSON Content-Type and XML body', async () => {
  433. const app = proxyquire('../app', {
  434. './lib/db': mockDb
  435. });
  436. const xmlFruitData = '<?xml version="1.0" encoding="UTF-8"?><fruit><name>adam</name><stock>10</stock></fruit>';
  437. const response = await supertest(app)
  438. .put('/api/fruits/10')
  439. .set('Content-Type', 'application/json')
  440. .send(xmlFruitData)
  441. .expect(415);
  442. assert.strictEqual(response.statusCode, 415);
  443. assert.strictEqual(response.text, 'Invalid payload!');
  444. });
  445. it('put - error - no numeric stock', async () => {
  446. const fruitData = {
  447. name: 'Banana',
  448. stock: 'two'
  449. };
  450. const app = proxyquire('../app', {
  451. './lib/db': mockDb
  452. });
  453. const response = await supertest(app)
  454. .put('/api/fruits/10')
  455. .send(fruitData)
  456. .expect(422);
  457. assert.strictEqual(response.statusCode, 422);
  458. assert.strictEqual(response.text, 'The stock must be greater or equal to 0!');
  459. });
  460. it('delete', async () => {
  461. const mockApi = {
  462. remove: id => {
  463. assert.strictEqual(id, '1');
  464. return Promise.resolve({ rowCount: 1 });
  465. }
  466. };
  467. // Mock the nested require
  468. const routesStub = proxyquire('../lib/routes/fruits', {
  469. '../api/fruits': mockApi
  470. });
  471. const app = proxyquire('../app', {
  472. './lib/db': mockDb,
  473. './lib/routes/fruits': routesStub
  474. });
  475. const response = await supertest(app)
  476. .delete('/api/fruits/1')
  477. .expect(204);
  478. assert.strictEqual(response.statusCode, 204);
  479. });
  480. it('delete - error - not found', async () => {
  481. const mockApi = {
  482. remove: () => {
  483. return Promise.resolve({ rowCount: 0 });
  484. }
  485. };
  486. // Mock the nested require
  487. const routesStub = proxyquire('../lib/routes/fruits', {
  488. '../api/fruits': mockApi
  489. });
  490. const app = proxyquire('../app', {
  491. './lib/db': mockDb,
  492. './lib/routes/fruits': routesStub
  493. });
  494. const response = await supertest(app)
  495. .delete('/api/fruits/1')
  496. .expect(404);
  497. assert.strictEqual(response.statusCode, 404);
  498. assert.strictEqual(response.text, 'Unknown item 1');
  499. });
  500. it('delete - error', async () => {
  501. const mockApi = {
  502. remove: () => {
  503. return Promise.reject(new Error('error'));
  504. }
  505. };
  506. // Mock the nested require
  507. const routesStub = proxyquire('../lib/routes/fruits', {
  508. '../api/fruits': mockApi
  509. });
  510. const app = proxyquire('../app', {
  511. './lib/db': mockDb,
  512. './lib/routes/fruits': routesStub
  513. });
  514. const response = await supertest(app)
  515. .delete('/api/fruits/1')
  516. .expect(400);
  517. assert.strictEqual(response.statusCode, 400);
  518. });
  519. });