@@ -61,6 +61,51 @@ describe('errors', () => {
6161 const err = new KeyInvalidatedError ( 'invalid' , { alias : 'rnsi.svc.v1' } )
6262 expect ( err . alias ) . toBe ( 'rnsi.svc.v1' )
6363 } )
64+
65+ describe ( 'cause chaining' , ( ) => {
66+ it ( 'retains the provided cause on SensitiveInfoError' , ( ) => {
67+ const cause = new Error ( 'underlying' )
68+ const err = new SensitiveInfoError ( ErrorCode . NotFound , 'wrapped' , {
69+ cause,
70+ } )
71+ expect ( err . cause ) . toBe ( cause )
72+ } )
73+
74+ it ( 'keeps cause non-enumerable to match native ES2022 Error semantics' , ( ) => {
75+ const cause = new Error ( 'underlying' )
76+ const err = new SensitiveInfoError ( ErrorCode . NotFound , 'wrapped' , {
77+ cause,
78+ } )
79+ const descriptor = Object . getOwnPropertyDescriptor ( err , 'cause' )
80+ expect ( descriptor ) . toBeDefined ( )
81+ expect ( descriptor ?. enumerable ) . toBe ( false )
82+ expect ( Object . keys ( err ) ) . not . toContain ( 'cause' )
83+ expect ( JSON . parse ( JSON . stringify ( err ) ) ) . not . toHaveProperty ( 'cause' )
84+ } )
85+
86+ it ( 'does not define cause when not provided' , ( ) => {
87+ const err = new SensitiveInfoError ( ErrorCode . NotFound , 'wrapped' )
88+ expect ( Object . hasOwn ( err , 'cause' ) ) . toBe ( false )
89+ } )
90+
91+ it ( 'defines a non-enumerable own cause when explicitly passed as undefined' , ( ) => {
92+ const err = new SensitiveInfoError ( ErrorCode . NotFound , 'wrapped' , {
93+ cause : undefined ,
94+ } )
95+ const descriptor = Object . getOwnPropertyDescriptor ( err , 'cause' )
96+ expect ( Object . hasOwn ( err , 'cause' ) ) . toBe ( true )
97+ expect ( err . cause ) . toBeUndefined ( )
98+ expect ( descriptor ) . toBeDefined ( )
99+ expect ( descriptor ?. enumerable ) . toBe ( false )
100+ expect ( Object . keys ( err ) ) . not . toContain ( 'cause' )
101+ } )
102+
103+ it ( 'propagates cause through subclasses (NotFoundError)' , ( ) => {
104+ const cause = new Error ( 'native miss' )
105+ const err = new NotFoundError ( 'missing' , { cause } )
106+ expect ( err . cause ) . toBe ( cause )
107+ } )
108+ } )
64109 } )
65110
66111 describe ( 'toSensitiveInfoError' , ( ) => {
0 commit comments