index.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. /*!
  2. * koa-better-body <https://github.com/tunnckoCore/koa-better-body>
  3. *
  4. * Copyright (c) 2014 Charlike Mike Reagent, Daryl Lau, contributors.
  5. * Released under the MIT license.
  6. */
  7. 'use strict';
  8. /*!
  9. * Module dependencies.
  10. */
  11. var fs = require('fs'),
  12. koa = require('koa'),
  13. http = require('http'),
  14. request = require('supertest'),
  15. koaBody = require('../index'),
  16. Resource = require('koa-resource-router');
  17. describe('koa-body', function () {
  18. var database = {
  19. users: [
  20. {name: 'charlike', followers: 10},
  21. {name: 'tunnckocore', followers: 20}
  22. ]
  23. };
  24. /*!
  25. * DEFAULTS - multipart: false
  26. */
  27. it('should work with defaults - multipart: false, only `urlencoded` and `json` bodies', function (done) {
  28. var app = koa();
  29. var usersResource = new Resource('users', {
  30. // GET /users
  31. index: function* index(next) {
  32. this.status = 200;
  33. this.body = database;
  34. yield next;
  35. }
  36. });
  37. app.use(koaBody());
  38. app.use(usersResource.middleware());
  39. request(http.createServer(app.callback()))
  40. .get('/users')
  41. .expect(200, database)
  42. .end(function(err) {
  43. if (err) {return done(err);}
  44. done();
  45. });
  46. });
  47. /*!
  48. * MULTIPART - FIELDS
  49. */
  50. it('should recieve `multipart` requests - fields on .body.fields object', function (done) {
  51. var app = koa();
  52. var usersResource = new Resource('users', {
  53. // POST /users
  54. create: function* create(next) {
  55. database.users.push(this.request.body.fields);
  56. this.status = 201;
  57. this.body = this.request.body;
  58. yield next;
  59. }
  60. });
  61. app.use(koaBody({multipart: true}));
  62. app.use(usersResource.middleware());
  63. request(http.createServer(app.callback()))
  64. .post('/users')
  65. .field('name', 'daryl')
  66. .field('followers', 30)
  67. .expect(201)
  68. .end(function(err, res) {
  69. if (err) {return done(err);}
  70. var requested = database.users.pop();
  71. res.body.fields.should.have.property('name', requested.name);
  72. res.body.fields.should.have.property('followers', requested.followers);
  73. res.body.fields.name.should.equal('daryl');
  74. res.body.fields.followers.should.equal('30');
  75. res.body.fields.should.have.property('name', 'daryl');
  76. res.body.fields.should.have.property('followers', '30');
  77. done();
  78. });
  79. });
  80. /*!
  81. * MULTIPART - FILES
  82. */
  83. it('should recieve multiple files via `multipart` on .body.files object', function (done) {
  84. var app = koa();
  85. var usersResource = new Resource('users', {
  86. // POST /users
  87. create: function* create(next) {
  88. this.status = 201;
  89. this.body = this.request.body;
  90. yield next;
  91. }
  92. });
  93. app.use(koaBody({
  94. multipart: true,
  95. formidable: {
  96. uploadDir: __dirname + '/../'
  97. }
  98. }));
  99. app.use(usersResource.middleware());
  100. request(http.createServer(app.callback()))
  101. .post('/users')
  102. .type('multipart/form-data')
  103. .attach('firstField', 'package.json')
  104. .attach('secondField', 'index.js')
  105. .attach('secondField', 'license.md')
  106. .expect(201)
  107. .end(function(err, res){
  108. if (err) {return done(err);}
  109. res.body.files.firstField.name.should.equal('package.json');
  110. fs.unlinkSync(res.body.files.firstField.path);
  111. res.body.files.secondField[0].name.should.equal('index.js');
  112. res.body.files.secondField[1].name.should.equal('license.md');
  113. fs.unlinkSync(res.body.files.secondField[0].path);
  114. fs.unlinkSync(res.body.files.secondField[1].path);
  115. done();
  116. });
  117. });
  118. /*!
  119. * URLENCODED request body
  120. */
  121. it('should recieve `urlencoded` request bodies', function (done) {
  122. var app = koa();
  123. var usersResource = new Resource('users', {
  124. // POST /users
  125. create: function *(next) {
  126. database.users.push(this.request.body.fields);
  127. this.status = 201;
  128. this.body = this.request.body;
  129. yield next;
  130. }
  131. });
  132. app.use(koaBody({multipart: true}));
  133. app.use(usersResource.middleware());
  134. request(http.createServer(app.callback()))
  135. .post('/users')
  136. .type('application/x-www-form-urlencoded')
  137. .send('name=example&followers=41')
  138. .expect(201)
  139. .end(function(err, res) {
  140. if (err) {return done(err);}
  141. var requested = database.users.pop();
  142. res.body.fields.should.have.property('name', requested.name);
  143. res.body.fields.should.have.property('followers', requested.followers);
  144. res.body.fields.name.should.equal('example');
  145. res.body.fields.followers.should.equal('41');
  146. res.body.fields.should.have.property('name', 'example');
  147. res.body.fields.should.have.property('followers', '41');
  148. done();
  149. });
  150. });
  151. /*!
  152. * JSON request body
  153. */
  154. it('should recieve `json` request bodies', function (done) {
  155. var app = koa();
  156. var usersResource = new Resource('users', {
  157. // POST /users
  158. create: function* (next) {
  159. database.users.push(this.request.body.fields);
  160. this.status = 201;
  161. this.body = this.request.body;
  162. yield next;
  163. }
  164. });
  165. app.use(koaBody());
  166. app.use(usersResource.middleware());
  167. request(http.createServer(app.callback()))
  168. .post('/users')
  169. .type('application/json')
  170. .send({name: 'json'})
  171. .send({followers: 313})
  172. .expect(201)
  173. .end(function(err, res) {
  174. if (err) {return done(err);}
  175. var requested = database.users.pop();
  176. res.body.fields.should.have.property('name', requested.name);
  177. res.body.fields.should.have.property('followers', requested.followers);
  178. res.body.fields.name.should.equal('json');
  179. res.body.fields.followers.should.equal(313);
  180. res.body.fields.should.have.property('name', 'json');
  181. res.body.fields.should.have.property('followers', 313);
  182. done();
  183. });
  184. });
  185. /*!
  186. * FORM (urlencoded) LIMIT
  187. */
  188. it('should request 413 Request Entity Too Large, because of `formLimit`', function (done) {
  189. var app = koa();
  190. var usersResource = new Resource('users', {
  191. // POST /users
  192. create: function* create(next) {
  193. //suggestions for handling?
  194. //what if we want to make body more user-friendly?
  195. yield next;
  196. }
  197. });
  198. app.use(koaBody({formLimit: 10 /*bytes*/}));
  199. app.use(usersResource.middleware());
  200. request(http.createServer(app.callback()))
  201. .post('/users')
  202. .type('application/x-www-form-urlencoded')
  203. .send('user=www-form-urlencoded')
  204. .expect(413, 'Request Entity Too Large')
  205. .expect('content-length', 24)
  206. .end(done);
  207. });
  208. /*!
  209. * JSON LIMIT
  210. */
  211. it('should request 413 Request Entity Too Large, because of `jsonLimit`', function (done) {
  212. var app = koa();
  213. var usersResource = new Resource('users', {
  214. // POST /users
  215. create: function* create(next) {
  216. //suggestions for handling?
  217. //what if we want to make body more user-friendly?
  218. yield next;
  219. }
  220. });
  221. app.use(koaBody({jsonLimit: 10 /*bytes*/}));
  222. app.use(usersResource.middleware());
  223. request(http.createServer(app.callback()))
  224. .post('/users')
  225. .type('application/json')
  226. .send({name: 'some-long-name-for-limit'})
  227. .expect(413, 'Request Entity Too Large')
  228. .expect('content-length', 24)
  229. .end(done);
  230. });
  231. });