Validate that setSuiteProperty and setSpecProperty args are cloneable
This commit is contained in:
@@ -769,6 +769,14 @@ getJasmineRequireObj().util = function(j$) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
util.assertStructuredCloneable = function(v, msgPrefix) {
|
||||||
|
try {
|
||||||
|
structuredClone(v);
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error(`${msgPrefix} can't be cloned`, { cause: e });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return util;
|
return util;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -844,8 +852,12 @@ getJasmineRequireObj().Spec = function(j$) {
|
|||||||
return this.result.properties[key];
|
return this.result.properties[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: throw if the key or value is not structred cloneable
|
|
||||||
setSpecProperty(key, value) {
|
setSpecProperty(key, value) {
|
||||||
|
// Key and value will eventually be cloned during reporting. The error
|
||||||
|
// thrown at that point if they aren't cloneable isn't very helpful.
|
||||||
|
// Throw a better one now.
|
||||||
|
j$.util.assertStructuredCloneable(key, 'Key');
|
||||||
|
j$.util.assertStructuredCloneable(value, 'Value');
|
||||||
this.result.properties = this.result.properties || {};
|
this.result.properties = this.result.properties || {};
|
||||||
this.result.properties[key] = value;
|
this.result.properties[key] = value;
|
||||||
}
|
}
|
||||||
@@ -10604,6 +10616,11 @@ getJasmineRequireObj().Suite = function(j$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setSuiteProperty(key, value) {
|
setSuiteProperty(key, value) {
|
||||||
|
// Key and value will eventually be cloned during reporting. The error
|
||||||
|
// thrown at that point if they aren't cloneable isn't very helpful.
|
||||||
|
// Throw a better one now.
|
||||||
|
j$.util.assertStructuredCloneable(key, 'Key');
|
||||||
|
j$.util.assertStructuredCloneable(value, 'Value');
|
||||||
this.result.properties = this.result.properties || {};
|
this.result.properties = this.result.properties || {};
|
||||||
this.result.properties[key] = value;
|
this.result.properties[key] = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,6 +102,26 @@ describe('Spec', function() {
|
|||||||
b: 'original-value'
|
b: 'original-value'
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('throws if the key is not structured-cloneable', function() {
|
||||||
|
const spec = new jasmineUnderTest.Spec({
|
||||||
|
queueableFn: { fn: () => {} }
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(function() {
|
||||||
|
spec.setSpecProperty(new Promise(() => {}), '');
|
||||||
|
}).toThrowError("Key can't be cloned");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if the value is not structured-cloneable', function() {
|
||||||
|
const spec = new jasmineUnderTest.Spec({
|
||||||
|
queueableFn: { fn: () => {} }
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(function() {
|
||||||
|
spec.setSpecProperty('k', new Promise(() => {}));
|
||||||
|
}).toThrowError("Value can't be cloned");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('status', function() {
|
describe('status', function() {
|
||||||
|
|||||||
@@ -405,4 +405,22 @@ describe('Suite', function() {
|
|||||||
expect(subject.hasChildWithDescription('a spec')).toBeFalse();
|
expect(subject.hasChildWithDescription('a spec')).toBeFalse();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#setSuiteProperty', function() {
|
||||||
|
it('throws if the key is not structured-cloneable', function() {
|
||||||
|
const suite = new jasmineUnderTest.Suite({});
|
||||||
|
|
||||||
|
expect(function() {
|
||||||
|
suite.setSuiteProperty(new Promise(() => {}), '');
|
||||||
|
}).toThrowError("Key can't be cloned");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if the value is not structured-cloneable', function() {
|
||||||
|
const suite = new jasmineUnderTest.Suite({});
|
||||||
|
|
||||||
|
expect(function() {
|
||||||
|
suite.setSuiteProperty('k', new Promise(() => {}));
|
||||||
|
}).toThrowError("Value can't be cloned");
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -70,8 +70,12 @@ getJasmineRequireObj().Spec = function(j$) {
|
|||||||
return this.result.properties[key];
|
return this.result.properties[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: throw if the key or value is not structred cloneable
|
|
||||||
setSpecProperty(key, value) {
|
setSpecProperty(key, value) {
|
||||||
|
// Key and value will eventually be cloned during reporting. The error
|
||||||
|
// thrown at that point if they aren't cloneable isn't very helpful.
|
||||||
|
// Throw a better one now.
|
||||||
|
j$.util.assertStructuredCloneable(key, 'Key');
|
||||||
|
j$.util.assertStructuredCloneable(value, 'Value');
|
||||||
this.result.properties = this.result.properties || {};
|
this.result.properties = this.result.properties || {};
|
||||||
this.result.properties[key] = value;
|
this.result.properties[key] = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,11 @@ getJasmineRequireObj().Suite = function(j$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setSuiteProperty(key, value) {
|
setSuiteProperty(key, value) {
|
||||||
|
// Key and value will eventually be cloned during reporting. The error
|
||||||
|
// thrown at that point if they aren't cloneable isn't very helpful.
|
||||||
|
// Throw a better one now.
|
||||||
|
j$.util.assertStructuredCloneable(key, 'Key');
|
||||||
|
j$.util.assertStructuredCloneable(value, 'Value');
|
||||||
this.result.properties = this.result.properties || {};
|
this.result.properties = this.result.properties || {};
|
||||||
this.result.properties[key] = value;
|
this.result.properties[key] = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,5 +80,13 @@ getJasmineRequireObj().util = function(j$) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
util.assertStructuredCloneable = function(v, msgPrefix) {
|
||||||
|
try {
|
||||||
|
structuredClone(v);
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error(`${msgPrefix} can't be cloned`, { cause: e });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return util;
|
return util;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user