"use strict"; var assert = require("assert"), qs = require("./"); describe(".parse()", function() { it("query strings starting with a `?`", function() { assert.deepEqual(qs.parse("?foo=bar"), { foo: "bar" }) }), it("query strings starting with a `#`", function() { assert.deepEqual(qs.parse("#foo=bar"), { foo: "bar" }) }), it("query strings starting with a `&", function() { assert.deepEqual(qs.parse("&foo=bar&foo=baz"), { foo: ["bar", "baz"] }) }), it("parse a query string", function() { assert.deepEqual(qs.parse("foo=bar"), { foo: "bar" }) }), it("parse multiple query string", function() { assert.deepEqual(qs.parse("foo=bar&key=val"), { foo: "bar", key: "val" }) }), it("parse query string without a value", function() { assert.deepEqual(qs.parse("foo"), { foo: null }), assert.deepEqual(qs.parse("foo&key"), { foo: null, key: null }), assert.deepEqual(qs.parse("foo=bar&key"), { foo: "bar", key: null }) }), it("return empty object if no qss can be found", function() { assert.deepEqual(qs.parse("?"), {}), assert.deepEqual(qs.parse("&"), {}), assert.deepEqual(qs.parse("#"), {}), assert.deepEqual(qs.parse(" "), {}) }), it("handle `+` correctly", function() { assert.deepEqual(qs.parse("foo+faz=bar+baz++"), { "foo faz": "bar baz " }) }), it("handle multiple of the same key", function() { assert.deepEqual(qs.parse("foo=bar&foo=baz"), { foo: ["bar", "baz"] }) }), it("query strings params including embedded `=`", function() { assert.deepEqual(qs.parse("?param=http%3A%2F%2Fsomeurl%3Fid%3D2837"), { param: "http://someurl?id=2837" }) }) }), describe(".stringify()", function() { it("stringify", function() { assert.strictEqual(qs.stringify({ foo: "bar" }), "foo=bar"), assert.strictEqual(qs.stringify({ foo: "bar", bar: "baz" }), "bar=baz&foo=bar") }), it("different types", function() { assert.strictEqual(qs.stringify(), ""), assert.strictEqual(qs.stringify(0), "") }), it("URI encode", function() { assert.strictEqual(qs.stringify({ "foo bar": "baz faz" }), "foo%20bar=baz%20faz") }), it("handle array value", function() { assert.strictEqual(qs.stringify({ abc: "abc", foo: ["bar", "baz"] }), "abc=abc&foo=bar&foo=baz") }) }), describe(".extract()", function() { it("should extract qs from url", function() { assert.equal(qs.extract("http://foo.bar/?abc=def&hij=klm"), "abc=def&hij=klm"), assert.equal(qs.extract("http://foo.bar/?"), "") }), it("should handle strings not containing qs", function() { assert.equal(qs.extract("http://foo.bar/"), ""), assert.equal(qs.extract(""), "") }), it("should throw for invalid values", function() { assert.throws(function() { qs.extract(null) }, TypeError), assert.throws(function() { qs.extract(void 0) }, TypeError) }) });