[d24f17c] | 1 | var test = require("tape")
|
---|
| 2 | var extend = require("./")
|
---|
| 3 | var mutableExtend = require("./mutable")
|
---|
| 4 |
|
---|
| 5 | test("merge", function(assert) {
|
---|
| 6 | var a = { a: "foo" }
|
---|
| 7 | var b = { b: "bar" }
|
---|
| 8 |
|
---|
| 9 | assert.deepEqual(extend(a, b), { a: "foo", b: "bar" })
|
---|
| 10 | assert.end()
|
---|
| 11 | })
|
---|
| 12 |
|
---|
| 13 | test("replace", function(assert) {
|
---|
| 14 | var a = { a: "foo" }
|
---|
| 15 | var b = { a: "bar" }
|
---|
| 16 |
|
---|
| 17 | assert.deepEqual(extend(a, b), { a: "bar" })
|
---|
| 18 | assert.end()
|
---|
| 19 | })
|
---|
| 20 |
|
---|
| 21 | test("undefined", function(assert) {
|
---|
| 22 | var a = { a: undefined }
|
---|
| 23 | var b = { b: "foo" }
|
---|
| 24 |
|
---|
| 25 | assert.deepEqual(extend(a, b), { a: undefined, b: "foo" })
|
---|
| 26 | assert.deepEqual(extend(b, a), { a: undefined, b: "foo" })
|
---|
| 27 | assert.end()
|
---|
| 28 | })
|
---|
| 29 |
|
---|
| 30 | test("handle 0", function(assert) {
|
---|
| 31 | var a = { a: "default" }
|
---|
| 32 | var b = { a: 0 }
|
---|
| 33 |
|
---|
| 34 | assert.deepEqual(extend(a, b), { a: 0 })
|
---|
| 35 | assert.deepEqual(extend(b, a), { a: "default" })
|
---|
| 36 | assert.end()
|
---|
| 37 | })
|
---|
| 38 |
|
---|
| 39 | test("is immutable", function (assert) {
|
---|
| 40 | var record = {}
|
---|
| 41 |
|
---|
| 42 | extend(record, { foo: "bar" })
|
---|
| 43 | assert.equal(record.foo, undefined)
|
---|
| 44 | assert.end()
|
---|
| 45 | })
|
---|
| 46 |
|
---|
| 47 | test("null as argument", function (assert) {
|
---|
| 48 | var a = { foo: "bar" }
|
---|
| 49 | var b = null
|
---|
| 50 | var c = void 0
|
---|
| 51 |
|
---|
| 52 | assert.deepEqual(extend(b, a, c), { foo: "bar" })
|
---|
| 53 | assert.end()
|
---|
| 54 | })
|
---|
| 55 |
|
---|
| 56 | test("mutable", function (assert) {
|
---|
| 57 | var a = { foo: "bar" }
|
---|
| 58 |
|
---|
| 59 | mutableExtend(a, { bar: "baz" })
|
---|
| 60 |
|
---|
| 61 | assert.equal(a.bar, "baz")
|
---|
| 62 | assert.end()
|
---|
| 63 | })
|
---|
| 64 |
|
---|
| 65 | test("null prototype", function(assert) {
|
---|
| 66 | var a = { a: "foo" }
|
---|
| 67 | var b = Object.create(null)
|
---|
| 68 | b.b = "bar";
|
---|
| 69 |
|
---|
| 70 | assert.deepEqual(extend(a, b), { a: "foo", b: "bar" })
|
---|
| 71 | assert.end()
|
---|
| 72 | })
|
---|
| 73 |
|
---|
| 74 | test("null prototype mutable", function (assert) {
|
---|
| 75 | var a = { foo: "bar" }
|
---|
| 76 | var b = Object.create(null)
|
---|
| 77 | b.bar = "baz";
|
---|
| 78 |
|
---|
| 79 | mutableExtend(a, b)
|
---|
| 80 |
|
---|
| 81 | assert.equal(a.bar, "baz")
|
---|
| 82 | assert.end()
|
---|
| 83 | })
|
---|
| 84 |
|
---|
| 85 | test("prototype pollution", function (assert) {
|
---|
| 86 | var a = {}
|
---|
| 87 | var maliciousPayload = '{"__proto__":{"oops":"It works!"}}'
|
---|
| 88 |
|
---|
| 89 | assert.strictEqual(a.oops, undefined)
|
---|
| 90 | extend({}, maliciousPayload)
|
---|
| 91 | assert.strictEqual(a.oops, undefined)
|
---|
| 92 | assert.end()
|
---|
| 93 | })
|
---|
| 94 |
|
---|
| 95 | test("prototype pollution mutable", function (assert) {
|
---|
| 96 | var a = {}
|
---|
| 97 | var maliciousPayload = '{"__proto__":{"oops":"It works!"}}'
|
---|
| 98 |
|
---|
| 99 | assert.strictEqual(a.oops, undefined)
|
---|
| 100 | mutableExtend({}, maliciousPayload)
|
---|
| 101 | assert.strictEqual(a.oops, undefined)
|
---|
| 102 | assert.end()
|
---|
| 103 | })
|
---|