Skip to content

Commit

Permalink
kbn-expect - add .eql support for sets (elastic#200034)
Browse files Browse the repository at this point in the history
## Summary

This PR adds support for asserting test equality with kbn-expect. It
also introduces some unit tests to kbn-expect in order to verify the
changes are working.
  • Loading branch information
pheyos authored and CAWilson94 committed Nov 18, 2024
1 parent a1ae058 commit 5ad1e0c
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 2 deletions.
9 changes: 9 additions & 0 deletions packages/kbn-expect/expect.js
Original file line number Diff line number Diff line change
Expand Up @@ -647,6 +647,11 @@ function i (obj, showHidden, depth) {
return stylize('null', 'null');
}

// format sets like arrays
if (value instanceof Set) {
value = Array.from(value)
}

if (isDOMElement(value)) {
return getOuterHTML(value);
}
Expand Down Expand Up @@ -930,6 +935,10 @@ expect.eql = function eql(actual, expected) {
// to determine equivalence.
} else if (isRegExp(actual) && isRegExp(expected)) {
return regExpEquiv(actual, expected);
// If both are Sets, they should be treated equal if they have the same
// entries, independent of the ordering
} else if (actual instanceof Set && expected instanceof Set) {
return actual.size === expected.size && actual.difference(expected).size === 0;
// 7.4. For all other Object pairs, including Array objects, equivalence is
// determined by having the same number of owned properties (as verified
// with Object.prototype.hasOwnProperty.call), the same set of keys
Expand Down
47 changes: 47 additions & 0 deletions packages/kbn-expect/expect.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

// importing this package's expect as `kbnExpect` to not conflict with Jest's expect
import kbnExpect from './expect';

it('asserts that sets with same entries but different ordering are equal', async () => {
const setA = new Set(['a', 'b', 'c']);
const setB = new Set(['c', 'b', 'a']);

expect(() => {
kbnExpect(setA).to.eql(setB);
}).not.toThrow();
expect(() => {
kbnExpect(setB).to.eql(setA);
}).not.toThrow();
});

it('asserts that sets with same size but different entries are not equal', async () => {
const setA = new Set(['a', 'b', 'c']);
const setB = new Set(['x', 'y', 'z']);

expect(() => {
kbnExpect(setA).to.eql(setB);
}).toThrow();
expect(() => {
kbnExpect(setB).to.eql(setA);
}).toThrow();
});

it('asserts that sets with different size but overlapping items are not equal', async () => {
const setA = new Set(['a', 'b', 'c']);
const setB = new Set(['a', 'b']);

expect(() => {
kbnExpect(setA).to.eql(setB);
}).toThrow();
expect(() => {
kbnExpect(setB).to.eql(setA);
}).toThrow();
});
14 changes: 14 additions & 0 deletions packages/kbn-expect/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

module.exports = {
preset: '@kbn/test/jest_node',
rootDir: '../..',
roots: ['<rootDir>/packages/kbn-expect'],
};
8 changes: 6 additions & 2 deletions packages/kbn-expect/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "target/types"
"outDir": "target/types",
"types": [
"jest",
],
},
"include": [
"expect.d.ts"
"expect.d.ts",
"**/*.ts"
],
"exclude": [
"target/**/*",
Expand Down

0 comments on commit 5ad1e0c

Please sign in to comment.