fix(Assertion): Improve toHaveProperty alias by forwarding arguments correctly for intuitive object property assertions
This commit is contained in:
		| @@ -1,5 +1,12 @@ | ||||
| # Changelog | ||||
|  | ||||
| ## 2025-04-30 - 2.4.1 - fix(Assertion) | ||||
| Improve toHaveProperty alias by forwarding arguments correctly for intuitive object property assertions | ||||
|  | ||||
| - Updated the toHaveProperty method in the Assertion class to check the number of arguments and call the appropriate object matcher | ||||
| - Added several scratch alias files to demonstrate and test the alias usage | ||||
| - Enhanced test cases in test/propertypath to cover alias behavior | ||||
|  | ||||
| ## 2025-04-30 - 2.4.0 - feat(object) | ||||
| add toHaveOwnProperty method and improve property-path matching in object assertions | ||||
|  | ||||
|   | ||||
							
								
								
									
										14
									
								
								scratch-alias.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								scratch-alias.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| import * as smartexpect from './dist_ts/index.js'; | ||||
| const obj = { topLevel: 'hello' }; | ||||
| try { | ||||
|   smartexpect.expect(obj).toHaveProperty('topLevel'); | ||||
|   console.log('alias toHaveProperty succeeded'); | ||||
| } catch(err) { | ||||
|   console.error('alias toHaveProperty failed:', err.message); | ||||
| } | ||||
| try { | ||||
|   smartexpect.expect(obj).not.toHaveProperty('missing'); | ||||
|   console.log('alias not.toHaveProperty succeeded'); | ||||
| } catch(err) { | ||||
|   console.error('alias not.toHaveProperty failed:', err.message); | ||||
| } | ||||
							
								
								
									
										20
									
								
								scratch-alias2.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								scratch-alias2.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| import * as smartexpect from './dist_ts/index.js'; | ||||
| console.log('script start'); | ||||
| const obj = { topLevel: 'hello' }; | ||||
| console.log('script: after obj'); | ||||
| console.log('script: test for alias toHaveProperty'); | ||||
| try { | ||||
|   smartexpect.expect(obj).toHaveProperty('topLevel'); | ||||
|   console.log('alias toHaveProperty succeeded'); | ||||
| } catch(err) { | ||||
|   console.error('alias toHaveProperty failed:', err.message); | ||||
| } | ||||
| console.log('script: after first try'); | ||||
| console.log('script: test for alias not.toHaveProperty'); | ||||
| try { | ||||
|   smartexpect.expect(obj).not.toHaveProperty('missing'); | ||||
|   console.log('alias not.toHaveProperty succeeded'); | ||||
| } catch(err) { | ||||
|   console.error('alias not.toHaveProperty failed:', err.message); | ||||
| } | ||||
| console.log('script end'); | ||||
							
								
								
									
										8
									
								
								scratch-alias3.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								scratch-alias3.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| import * as smartexpect from './dist_ts/index.js'; | ||||
| console.log('script start'); | ||||
| const obj = { topLevel: 'hello' }; | ||||
| console.log('script: test alias toHaveProperty'); | ||||
| const ret = smartexpect.expect(obj).toHaveProperty('topLevel'); | ||||
| console.log('got ret:', ret, 'typeof', typeof ret); | ||||
| console.log('ret.then?', ret && typeof (ret as any).then); | ||||
| console.log('script end'); | ||||
							
								
								
									
										8
									
								
								scratch-alias4.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								scratch-alias4.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| import * as smartexpect from './dist_ts/index.js'; | ||||
| console.log('script start'); | ||||
| const obj = { topLevel: 'hello' }; | ||||
| console.log('script: test alias toHaveProperty'); | ||||
| const ret = smartexpect.expect(obj).toHaveProperty('topLevel'); | ||||
| console.log('got ret:', ret, 'typeof', typeof ret); | ||||
| console.log('ret.then?', ret && ret.then); | ||||
| console.log('script end'); | ||||
							
								
								
									
										10
									
								
								scratch-alias5.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								scratch-alias5.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| import * as smartexpect from './dist_ts/index.js'; | ||||
| console.log('start'); | ||||
| const obj = { topLevel: 'hello' }; | ||||
| try { | ||||
|   smartexpect.expect(obj).toHaveProperty('topLevel'); | ||||
|   console.log('success'); | ||||
| } catch (e) { | ||||
|   console.log('caught in catch:', e, e.message); | ||||
| } | ||||
| console.log('end'); | ||||
| @@ -5,6 +5,7 @@ tap.test('toHaveProperty nested path via dot notation', async () => { | ||||
|   const testObject = { level1: { level2: { level3: 'value' }},  publicTest: 'hi' }; | ||||
|  | ||||
|   smartexpect.expect(testObject).object.toHaveProperty('publicTest'); | ||||
|   smartexpect.expect(testObject).toHaveProperty('publicTest'); | ||||
|   // Existence check | ||||
|   smartexpect.expect(testObject).object.toHaveProperty('level1.level2.level3'); | ||||
|   // Value check | ||||
|   | ||||
| @@ -3,6 +3,6 @@ | ||||
|  */ | ||||
| export const commitinfo = { | ||||
|   name: '@push.rocks/smartexpect', | ||||
|   version: '2.4.0', | ||||
|   version: '2.4.1', | ||||
|   description: 'A testing library to manage expectations in code, offering both synchronous and asynchronous assertion methods.' | ||||
| } | ||||
|   | ||||
| @@ -355,7 +355,13 @@ export class Assertion<T = unknown, M extends TExecutionType = 'sync'> { | ||||
|   public toInclude(substring: string) { return this.string.toInclude(substring); } | ||||
|   public toMatch(regex: RegExp) { return this.string.toMatch(regex); } | ||||
|   public toBeOneOf(values: any[]) { return this.string.toBeOneOf(values as string[]); } | ||||
|   public toHaveProperty(property: string, value?: any) { return this.object.toHaveProperty(property, value); } | ||||
|   public toHaveProperty(property: string, value?: any) { | ||||
|     // Forward only provided arguments to object matcher to preserve argument count | ||||
|     if (arguments.length === 2) { | ||||
|       return this.object.toHaveProperty(property, value); | ||||
|     } | ||||
|     return this.object.toHaveProperty(property); | ||||
|   } | ||||
|   public toHaveOwnProperty(property: string, value?: any) { return this.object.toHaveOwnProperty(property, value); } | ||||
|   public toMatchObject(expected: object) { return this.object.toMatchObject(expected); } | ||||
|   public toBeInstanceOf(constructor: any) { return this.object.toBeInstanceOf(constructor); } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user