import test from 'ava';
import serialize from './';
test(t => {
const serialized = serialize(new Error('foo'));
const x = Object.keys(serialized);
t.not(x.indexOf('name'), -1);
t.not(x.indexOf('stack'), -1);
t.not(x.indexOf('message'), -1);
t.end();
});
test('should destroy circular references', t => {
const obj = {};
obj.child = {parent: obj};
const serialized = serialize(obj);
t.is(typeof serialized, 'object');
t.is(serialized.child.parent, '[Circular]');
t.end();
});
test('should not affect the original object', t => {
const obj = {};
obj.child = {parent: obj};
const serialized = serialize(obj);
t.not(serialized, obj);
t.is(obj.child.parent, obj);
t.end();
});
test('should only destroy parent references', t => {
const obj = {};
const common = {thing: obj};
obj.one = {firstThing: common};
obj.two = {secondThing: common};
const serialized = serialize(obj);
t.is(typeof serialized.one.firstThing, 'object');
t.is(typeof serialized.two.secondThing, 'object');
t.is(serialized.one.firstThing.thing, '[Circular]');
t.is(serialized.two.secondThing.thing, '[Circular]');
t.end();
});
test('should work on arrays', t => {
const obj = {};
const common = [obj];
const x = [common];
const y = [['test'], common];
y[0][1] = y;
obj.a = {x: x};
obj.b = {y: y};
const serialized = serialize(obj);
t.true(Array.isArray(serialized.a.x));
t.is(serialized.a.x[0][0], '[Circular]');
t.is(serialized.b.y[0][0], 'test');
t.is(serialized.b.y[1][0], '[Circular]');
t.is(serialized.b.y[0][1], '[Circular]');
t.end();
});
test('should discard nested functions', t => {
function a() {}
function b() {}
a.b = b;
const obj = {a: a};
const serialized = serialize(obj);
t.same(serialized, {});
t.end();
});
test('should replace top-level functions with a helpful string', t => {
function a() {}
function b() {}
a.b = b;
const serialized = serialize(a);
t.is(serialized, '[Function: a]');
t.end();
});
test('should drop functions', t => {
function a() {}
a.foo = 'bar;';
a.b = a;
const obj = {a: a};
const serialized = serialize(obj);
t.same(serialized, {});
t.false(serialized.hasOwnProperty('a'));
t.end();
});