Compare commits

..

4 Commits

Author SHA1 Message Date
0d3d498240 2.3.3
Some checks failed
Default (tags) / security (push) Failing after 9s
Default (tags) / test (push) Failing after 8s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2025-04-30 18:02:07 +00:00
30604dc77b fix(tests): Fix test file naming inconsistencies 2025-04-30 18:02:07 +00:00
84fd23d6a4 2.3.2
Some checks failed
Default (tags) / security (push) Failing after 19s
Default (tags) / test (push) Failing after 8s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2025-04-30 18:00:29 +00:00
e7941e7b99 fix(object): Update toHaveProperty matcher to support nested property paths using dot notation 2025-04-30 18:00:29 +00:00
6 changed files with 37 additions and 5 deletions

View File

@ -1,5 +1,18 @@
# Changelog # Changelog
## 2025-04-30 - 2.3.3 - fix(tests)
Fix test file naming inconsistencies
- Rename 'test/test.diffOutput.ts' to 'test/test.diffoutput.ts' to standardize filename casing
- Rename 'test/test.propertyPath.ts' to 'test/test.propertypath.ts' for consistent file naming
## 2025-04-30 - 2.3.2 - fix(object)
Update toHaveProperty matcher to support nested property paths using dot notation
- Changed toHaveProperty implementation to split property strings on '.' and traverse nested objects
- Fixed value comparison for nested properties by comparing the final drilled value instead of direct property access
- Added tests for nested property access in test/propertyPath.ts
## 2025-04-30 - 2.3.1 - fix(readme) ## 2025-04-30 - 2.3.1 - fix(readme)
Improve README documentation with detailed 'Why SmartExpect' benefits section Improve README documentation with detailed 'Why SmartExpect' benefits section

View File

@ -1,6 +1,6 @@
{ {
"name": "@push.rocks/smartexpect", "name": "@push.rocks/smartexpect",
"version": "2.3.1", "version": "2.3.3",
"private": false, "private": false,
"description": "A testing library to manage expectations in code, offering both synchronous and asynchronous assertion methods.", "description": "A testing library to manage expectations in code, offering both synchronous and asynchronous assertion methods.",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",

14
test/test.propertypath.ts Normal file
View File

@ -0,0 +1,14 @@
import { tap, expect as tExpect } from '@push.rocks/tapbundle';
import * as smartexpect from '../dist_ts/index.js';
tap.test('toHaveProperty nested path via dot notation', async () => {
const testObject = { level1: { level2: { level3: 'value' } } };
// Existence check
smartexpect.expect(testObject).object.toHaveProperty('level1.level2.level3');
// Value check
smartexpect.expect(testObject).object.toHaveProperty('level1.level2.level3', 'value');
// Negation for missing deep property
smartexpect.expect(testObject).not.object.toHaveProperty('level1.level2.missing');
});
export default tap.start();

View File

@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@push.rocks/smartexpect', name: '@push.rocks/smartexpect',
version: '2.3.1', version: '2.3.3',
description: 'A testing library to manage expectations in code, offering both synchronous and asynchronous assertion methods.' description: 'A testing library to manage expectations in code, offering both synchronous and asynchronous assertion methods.'
} }

View File

@ -62,11 +62,16 @@ export class ObjectMatchers<T extends object, M extends TExecutionType> {
return this.assertion.customAssertion( return this.assertion.customAssertion(
(v) => { (v) => {
const obj = v as any; const obj = v as any;
if (!(property in obj)) { const path = property.split('.');
let current = obj;
for (const key of path) {
if (current == null || !(key in current)) {
return false; return false;
} }
current = current[key];
}
if (arguments.length === 2) { if (arguments.length === 2) {
return plugins.fastDeepEqual(obj[property], value); return plugins.fastDeepEqual(current, value);
} }
return true; return true;
}, },