@@ -54,7 +54,10 @@ jest.mock('./passkey', () => ({
5454jest . mock ( '@docknetwork/wallet-sdk-core/src/wallet' , ( ) => ( {
5555 createWallet : jest . fn ( ) . mockImplementation ( async ( ) => {
5656 mockCallOrder . push ( 'createWallet' ) ;
57- return { mockWallet : true } ;
57+ return {
58+ mockWallet : true ,
59+ eventManager : { addListener : jest . fn ( ) , removeListener : jest . fn ( ) } ,
60+ } ;
5861 } ) ,
5962} ) ) ;
6063
@@ -75,7 +78,10 @@ jest.mock('@docknetwork/wallet-sdk-core/src/did-provider', () => ({
7578jest . mock ( '@docknetwork/wallet-sdk-core/src/message-provider' , ( ) => ( {
7679 createMessageProvider : jest . fn ( ) . mockImplementation ( ( ) => {
7780 mockCallOrder . push ( 'createMessageProvider' ) ;
78- return { mockMessageProvider : true } ;
81+ return {
82+ mockMessageProvider : true ,
83+ addMessageListener : jest . fn ( ) . mockReturnValue ( ( ) => { } ) ,
84+ } ;
7985 } ) ,
8086} ) ) ;
8187
@@ -87,6 +93,39 @@ jest.mock('@docknetwork/wallet-sdk-wasm/src/services/blockchain', () => ({
8793 blockchainService : { ensureBlockchainReady : jest . fn ( ) } ,
8894} ) ) ;
8995
96+ jest . mock (
97+ '@docknetwork/wallet-sdk-core/src/delegation/delegation-offer' ,
98+ ( ) => ( {
99+ createDelegationOffer : jest . fn ( ) . mockResolvedValue ( { id : 'offer-1' } ) ,
100+ createOOBInvitation : jest . fn ( ) ,
101+ acceptDelegationOffer : jest . fn ( ) . mockResolvedValue ( undefined ) ,
102+ handleMessage : jest . fn ( ) . mockResolvedValue ( undefined ) ,
103+ decodeMessage : jest . fn ( ) ,
104+ } ) ,
105+ ) ;
106+ jest . mock (
107+ '@docknetwork/wallet-sdk-core/src/delegation/delegation-issuance' ,
108+ ( ) => ( { issueCredential : jest . fn ( ) , delegateCredential : jest . fn ( ) } ) ,
109+ ) ;
110+ jest . mock (
111+ '@docknetwork/wallet-sdk-core/src/delegation/delegation-policy' ,
112+ ( ) => ( { getDelegationDetails : jest . fn ( ) . mockResolvedValue ( { role : { } } ) } ) ,
113+ ) ;
114+ jest . mock (
115+ '@docknetwork/wallet-sdk-core/src/delegation/delegation-chain' ,
116+ ( ) => ( {
117+ getDelegationChain : jest . fn ( ) ,
118+ } ) ,
119+ ) ;
120+ jest . mock (
121+ '@docknetwork/wallet-sdk-core/src/delegation/delegation-revocation' ,
122+ ( ) => ( {
123+ revokeDelegatableCredential : jest . fn ( ) ,
124+ unrevokeDelegatableCredential : jest . fn ( ) ,
125+ isDelegatableCredentialRevoked : jest . fn ( ) ,
126+ } ) ,
127+ ) ;
128+
90129const {
91130 initializeCloudWallet,
92131} = require ( '@docknetwork/wallet-sdk-core/src/cloud-wallet' ) ;
@@ -390,4 +429,118 @@ describe('WalletSDK initialize', () => {
390429 ) ;
391430 } ) ;
392431 } ) ;
432+
433+ describe ( 'delegation' , ( ) => {
434+ const {
435+ createDelegationOffer,
436+ acceptDelegationOffer,
437+ handleMessage,
438+ } = require ( '@docknetwork/wallet-sdk-core/src/delegation/delegation-offer' ) ;
439+ const {
440+ getDelegationDetails,
441+ } = require ( '@docknetwork/wallet-sdk-core/src/delegation/delegation-policy' ) ;
442+ const config = {
443+ edvUrl : 'https://edv.example.com' ,
444+ edvAuthKey : 'auth-key' ,
445+ masterKey : new Uint8Array ( [ 1 , 2 , 3 ] ) ,
446+ networkId : 'testnet' ,
447+ } ;
448+
449+ it ( 're-exports delegation functions' , ( ) => {
450+ [
451+ 'createDelegationOffer' ,
452+ 'createOOBInvitation' ,
453+ 'acceptDelegationOffer' ,
454+ 'handleMessage' ,
455+ 'decodeMessage' ,
456+ 'issueCredential' ,
457+ 'delegateCredential' ,
458+ 'getDelegationDetails' ,
459+ 'getDelegationChain' ,
460+ 'revokeDelegatableCredential' ,
461+ 'unrevokeDelegatableCredential' ,
462+ 'isDelegatableCredentialRevoked' ,
463+ ] . forEach ( name => expect ( typeof WalletSDK [ name ] ) . toBe ( 'function' ) ) ;
464+ } ) ;
465+
466+ it ( 'enableDelegation registers a message listener that routes to handleMessage' , async ( ) => {
467+ const wallet = await WalletSDK . initialize ( config ) ;
468+ const stop = wallet . enableDelegation ( ) ;
469+
470+ expect ( wallet . messageProvider . addMessageListener ) . toHaveBeenCalledTimes (
471+ 1 ,
472+ ) ;
473+ // Invoke the registered listener and confirm it delegates to handleMessage.
474+ const listener =
475+ wallet . messageProvider . addMessageListener . mock . calls [ 0 ] [ 0 ] ;
476+ await listener ( 'some-oob-url' ) ;
477+ expect ( handleMessage ) . toHaveBeenCalledWith ( 'some-oob-url' , {
478+ wallet : wallet . wallet ,
479+ messageProvider : wallet . messageProvider ,
480+ } ) ;
481+ expect ( typeof stop ) . toBe ( 'function' ) ;
482+ } ) ;
483+
484+ it ( 'enableDelegation subscribes callbacks to wallet events and unsubscribes on stop' , async ( ) => {
485+ const wallet = await WalletSDK . initialize ( config ) ;
486+ const onOfferReceived = jest . fn ( ) ;
487+ const onCredentialReceived = jest . fn ( ) ;
488+
489+ const removeMessageListener = jest . fn ( ) ;
490+ wallet . messageProvider . addMessageListener . mockReturnValueOnce (
491+ removeMessageListener ,
492+ ) ;
493+
494+ const stop = wallet . enableDelegation ( {
495+ onOfferReceived,
496+ onCredentialReceived,
497+ } ) ;
498+
499+ expect ( wallet . wallet . eventManager . addListener ) . toHaveBeenCalledWith (
500+ 'delegationOfferReceived' ,
501+ onOfferReceived ,
502+ ) ;
503+ expect ( wallet . wallet . eventManager . addListener ) . toHaveBeenCalledWith (
504+ 'delegatedCredentialReceived' ,
505+ onCredentialReceived ,
506+ ) ;
507+
508+ stop ( ) ;
509+
510+ expect ( removeMessageListener ) . toHaveBeenCalledTimes ( 1 ) ;
511+ expect ( wallet . wallet . eventManager . removeListener ) . toHaveBeenCalledWith (
512+ 'delegationOfferReceived' ,
513+ onOfferReceived ,
514+ ) ;
515+ expect ( wallet . wallet . eventManager . removeListener ) . toHaveBeenCalledWith (
516+ 'delegatedCredentialReceived' ,
517+ onCredentialReceived ,
518+ ) ;
519+ } ) ;
520+
521+ it ( 'binds wallet/messageProvider to the delegation methods' , async ( ) => {
522+ const wallet = await WalletSDK . initialize ( config ) ;
523+
524+ await wallet . createDelegationOffer ( {
525+ issuerDID : 'did:x' ,
526+ delegationRole : 'r' ,
527+ } ) ;
528+ expect ( createDelegationOffer ) . toHaveBeenCalledWith (
529+ expect . objectContaining ( { wallet : wallet . wallet , issuerDID : 'did:x' } ) ,
530+ ) ;
531+
532+ await wallet . acceptDelegationOffer ( { id : 'offer-1' } ) ;
533+ expect ( acceptDelegationOffer ) . toHaveBeenCalledWith ( {
534+ delegationOffer : { id : 'offer-1' } ,
535+ wallet : wallet . wallet ,
536+ messageProvider : wallet . messageProvider ,
537+ } ) ;
538+
539+ await wallet . getDelegationDetails ( { id : 'cred-1' } ) ;
540+ expect ( getDelegationDetails ) . toHaveBeenCalledWith (
541+ { id : 'cred-1' } ,
542+ wallet . wallet ,
543+ ) ;
544+ } ) ;
545+ } ) ;
393546} ) ;
0 commit comments