You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

177 lines
5.2 KiB

8 years ago
  1. // Load modules
  2. var Lab = require('lab');
  3. var Qs = require('../');
  4. // Declare internals
  5. var internals = {};
  6. // Test shortcuts
  7. var lab = exports.lab = Lab.script();
  8. var expect = Lab.expect;
  9. var describe = lab.experiment;
  10. var it = lab.test;
  11. describe('stringify()', function () {
  12. it('stringifies a querystring object', function (done) {
  13. expect(Qs.stringify({ a: 'b' })).to.equal('a=b');
  14. expect(Qs.stringify({ a: 1 })).to.equal('a=1');
  15. expect(Qs.stringify({ a: 1, b: 2 })).to.equal('a=1&b=2');
  16. done();
  17. });
  18. it('stringifies a nested object', function (done) {
  19. expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c');
  20. expect(Qs.stringify({ a: { b: { c: { d: 'e' } } } })).to.equal('a%5Bb%5D%5Bc%5D%5Bd%5D=e');
  21. done();
  22. });
  23. it('stringifies an array value', function (done) {
  24. expect(Qs.stringify({ a: ['b', 'c', 'd'] })).to.equal('a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d');
  25. done();
  26. });
  27. it('omits array indices when asked', function (done) {
  28. expect(Qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false })).to.equal('a=b&a=c&a=d');
  29. done();
  30. });
  31. it('stringifies a nested array value', function (done) {
  32. expect(Qs.stringify({ a: { b: ['c', 'd'] } })).to.equal('a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d');
  33. done();
  34. });
  35. it('stringifies an object inside an array', function (done) {
  36. expect(Qs.stringify({ a: [{ b: 'c' }] })).to.equal('a%5B0%5D%5Bb%5D=c');
  37. expect(Qs.stringify({ a: [{ b: { c: [1] } }] })).to.equal('a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1');
  38. done();
  39. });
  40. it('does not omit object keys when indices = false', function (done) {
  41. expect(Qs.stringify({ a: [{ b: 'c' }] }, { indices: false })).to.equal('a%5Bb%5D=c');
  42. done();
  43. });
  44. it('stringifies a complicated object', function (done) {
  45. expect(Qs.stringify({ a: { b: 'c', d: 'e' } })).to.equal('a%5Bb%5D=c&a%5Bd%5D=e');
  46. done();
  47. });
  48. it('stringifies an empty value', function (done) {
  49. expect(Qs.stringify({ a: '' })).to.equal('a=');
  50. expect(Qs.stringify({ a: '', b: '' })).to.equal('a=&b=');
  51. expect(Qs.stringify({ a: null })).to.equal('a=');
  52. expect(Qs.stringify({ a: { b: null } })).to.equal('a%5Bb%5D=');
  53. done();
  54. });
  55. it('stringifies an empty object', function (done) {
  56. var obj = Object.create(null);
  57. obj.a = 'b';
  58. expect(Qs.stringify(obj)).to.equal('a=b');
  59. done();
  60. });
  61. it('returns an empty string for invalid input', function (done) {
  62. expect(Qs.stringify(undefined)).to.equal('');
  63. expect(Qs.stringify(false)).to.equal('');
  64. expect(Qs.stringify(null)).to.equal('');
  65. expect(Qs.stringify('')).to.equal('');
  66. done();
  67. });
  68. it('stringifies an object with an empty object as a child', function (done) {
  69. var obj = {
  70. a: Object.create(null)
  71. };
  72. obj.a.b = 'c';
  73. expect(Qs.stringify(obj)).to.equal('a%5Bb%5D=c');
  74. done();
  75. });
  76. it('drops keys with a value of undefined', function (done) {
  77. expect(Qs.stringify({ a: undefined })).to.equal('');
  78. expect(Qs.stringify({ a: { b: undefined, c: null } })).to.equal('a%5Bc%5D=');
  79. done();
  80. });
  81. it('url encodes values', function (done) {
  82. expect(Qs.stringify({ a: 'b c' })).to.equal('a=b%20c');
  83. done();
  84. });
  85. it('stringifies a date', function (done) {
  86. var now = new Date();
  87. var str = 'a=' + encodeURIComponent(now.toISOString());
  88. expect(Qs.stringify({ a: now })).to.equal(str);
  89. done();
  90. });
  91. it('stringifies the weird object from qs', function (done) {
  92. expect(Qs.stringify({ 'my weird field': 'q1!2"\'w$5&7/z8)?' })).to.equal('my%20weird%20field=q1!2%22\'w%245%267%2Fz8)%3F');
  93. done();
  94. });
  95. it('skips properties that are part of the object prototype', function (done) {
  96. Object.prototype.crash = 'test';
  97. expect(Qs.stringify({ a: 'b'})).to.equal('a=b');
  98. expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c');
  99. delete Object.prototype.crash;
  100. done();
  101. });
  102. it('stringifies boolean values', function (done) {
  103. expect(Qs.stringify({ a: true })).to.equal('a=true');
  104. expect(Qs.stringify({ a: { b: true } })).to.equal('a%5Bb%5D=true');
  105. expect(Qs.stringify({ b: false })).to.equal('b=false');
  106. expect(Qs.stringify({ b: { c: false } })).to.equal('b%5Bc%5D=false');
  107. done();
  108. });
  109. it('stringifies buffer values', function (done) {
  110. expect(Qs.stringify({ a: new Buffer('test') })).to.equal('a=test');
  111. expect(Qs.stringify({ a: { b: new Buffer('test') } })).to.equal('a%5Bb%5D=test');
  112. done();
  113. });
  114. it('stringifies an object using an alternative delimiter', function (done) {
  115. expect(Qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' })).to.equal('a=b;c=d');
  116. done();
  117. });
  118. it('doesn\'t blow up when Buffer global is missing', function (done) {
  119. var tempBuffer = global.Buffer;
  120. delete global.Buffer;
  121. expect(Qs.stringify({ a: 'b', c: 'd' })).to.equal('a=b&c=d');
  122. global.Buffer = tempBuffer;
  123. done();
  124. });
  125. });