Blob Blame History Raw
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();
});