1- import { Messenger } from '@metamask/base-controller' ;
21import type { InternalAccount } from '@metamask/keyring-internal-api' ;
2+ import {
3+ Messenger ,
4+ MOCK_ANY_NAMESPACE ,
5+ type MessengerActions ,
6+ type MessengerEvents ,
7+ type MockAnyNamespace ,
8+ } from '@metamask/messenger' ;
39import type { Hex } from '@metamask/utils' ;
410import nock , { isDone } from 'nock' ;
511
6- import type {
7- AccountActivityServiceAllowedEvents ,
8- AccountActivityServiceAllowedActions ,
9- } from './AccountActivityService' ;
1012import {
1113 AccountActivityService ,
1214 type AccountActivityServiceMessenger ,
1315 type SubscriptionOptions ,
14- ACCOUNT_ACTIVITY_SERVICE_ALLOWED_ACTIONS ,
15- ACCOUNT_ACTIVITY_SERVICE_ALLOWED_EVENTS ,
1616} from './AccountActivityService' ;
1717import type { ServerNotificationMessage } from './BackendWebSocketService' ;
1818import { WebSocketState } from './BackendWebSocketService' ;
1919import type { Transaction , BalanceUpdate } from './types' ;
2020import type { AccountActivityMessage } from './types' ;
2121import { flushPromises } from '../../../tests/helpers' ;
2222
23+ type AllAccountActivityServiceActions =
24+ MessengerActions < AccountActivityServiceMessenger > ;
25+
26+ type AllAccountActivityServiceEvents =
27+ MessengerEvents < AccountActivityServiceMessenger > ;
28+
29+ type RootMessenger = Messenger <
30+ MockAnyNamespace ,
31+ AllAccountActivityServiceActions ,
32+ AllAccountActivityServiceEvents
33+ > ;
34+
2335// Helper function for completing async operations
2436const completeAsyncOperations = async ( timeoutMs = 0 ) => {
2537 await flushPromises ( ) ;
@@ -49,25 +61,70 @@ const createMockInternalAccount = (options: {
4961 scopes : [ 'eip155:1' ] , // Required scopes property
5062} ) ;
5163
64+ /**
65+ * Creates and returns a root messenger for testing
66+ *
67+ * @returns A messenger instance
68+ */
69+ function getRootMessenger ( ) : RootMessenger {
70+ return new Messenger ( {
71+ namespace : MOCK_ANY_NAMESPACE ,
72+ } ) ;
73+ }
74+
5275/**
5376 * Creates a real messenger with registered mock actions for testing
5477 * Each call creates a completely independent messenger to ensure test isolation
5578 *
5679 * @returns Object containing the messenger and mock action functions
5780 */
58- const getMessenger = ( ) => {
81+ const getMessenger = ( ) : {
82+ rootMessenger : RootMessenger ;
83+ messenger : AccountActivityServiceMessenger ;
84+ mocks : {
85+ getSelectedAccount : jest . Mock ;
86+ connect : jest . Mock ;
87+ disconnect : jest . Mock ;
88+ subscribe : jest . Mock ;
89+ channelHasSubscription : jest . Mock ;
90+ getSubscriptionsByChannel : jest . Mock ;
91+ findSubscriptionsByChannelPrefix : jest . Mock ;
92+ addChannelCallback : jest . Mock ;
93+ removeChannelCallback : jest . Mock ;
94+ } ;
95+ } => {
5996 // Use any types for the root messenger to avoid complex type constraints in tests
6097 // Create a unique root messenger for each test
61- const rootMessenger = new Messenger <
62- AccountActivityServiceAllowedActions ,
63- AccountActivityServiceAllowedEvents
64- > ( ) ;
65- const messenger : AccountActivityServiceMessenger =
66- rootMessenger . getRestricted ( {
67- name : 'AccountActivityService' ,
68- allowedActions : [ ...ACCOUNT_ACTIVITY_SERVICE_ALLOWED_ACTIONS ] ,
69- allowedEvents : [ ...ACCOUNT_ACTIVITY_SERVICE_ALLOWED_EVENTS ] ,
70- } ) ;
98+ const rootMessenger = getRootMessenger ( ) ;
99+ const messenger : AccountActivityServiceMessenger = new Messenger <
100+ 'AccountActivityService' ,
101+ AllAccountActivityServiceActions ,
102+ AllAccountActivityServiceEvents ,
103+ RootMessenger
104+ > ( {
105+ namespace : 'AccountActivityService' ,
106+ parent : rootMessenger ,
107+ } ) ;
108+
109+ rootMessenger . delegate ( {
110+ actions : [
111+ 'AccountsController:getSelectedAccount' ,
112+ 'BackendWebSocketService:connect' ,
113+ 'BackendWebSocketService:disconnect' ,
114+ 'BackendWebSocketService:subscribe' ,
115+ 'BackendWebSocketService:getConnectionInfo' ,
116+ 'BackendWebSocketService:channelHasSubscription' ,
117+ 'BackendWebSocketService:getSubscriptionsByChannel' ,
118+ 'BackendWebSocketService:findSubscriptionsByChannelPrefix' ,
119+ 'BackendWebSocketService:addChannelCallback' ,
120+ 'BackendWebSocketService:removeChannelCallback' ,
121+ ] ,
122+ events : [
123+ 'AccountsController:selectedAccountChange' ,
124+ 'BackendWebSocketService:connectionStateChanged' ,
125+ ] ,
126+ messenger,
127+ } ) ;
71128
72129 // Create mock action handlers
73130 const mockGetSelectedAccount = jest . fn ( ) ;
@@ -216,10 +273,7 @@ type WithServiceOptions = {
216273type WithServiceCallback < ReturnValue > = ( payload : {
217274 service : AccountActivityService ;
218275 messenger : AccountActivityServiceMessenger ;
219- rootMessenger : Messenger <
220- AccountActivityServiceAllowedActions ,
221- AccountActivityServiceAllowedEvents
222- > ;
276+ rootMessenger : RootMessenger ;
223277 mocks : {
224278 getSelectedAccount : jest . Mock ;
225279 connect : jest . Mock ;
@@ -633,7 +687,7 @@ describe('AccountActivityService', () => {
633687 } ) ;
634688
635689 // Publish WebSocket ERROR state event - will be picked up by controller subscription
636- await rootMessenger . publish (
690+ rootMessenger . publish (
637691 'BackendWebSocketService:connectionStateChanged' ,
638692 {
639693 state : WebSocketState . ERROR ,
@@ -686,7 +740,7 @@ describe('AccountActivityService', () => {
686740 } ) ;
687741
688742 // Publish account change event - will be picked up by controller subscription
689- await rootMessenger . publish (
743+ rootMessenger . publish (
690744 'AccountsController:selectedAccountChange' ,
691745 solanaAccount ,
692746 ) ;
@@ -716,7 +770,7 @@ describe('AccountActivityService', () => {
716770 } ) ;
717771
718772 // Publish account change event - will be picked up by controller subscription
719- await rootMessenger . publish (
773+ rootMessenger . publish (
720774 'AccountsController:selectedAccountChange' ,
721775 unknownAccount ,
722776 ) ;
@@ -738,7 +792,7 @@ describe('AccountActivityService', () => {
738792 mocks . getSelectedAccount . mockReturnValue ( null ) ;
739793
740794 // Publish WebSocket connection event - will be picked up by controller subscription
741- await rootMessenger . publish (
795+ rootMessenger . publish (
742796 'BackendWebSocketService:connectionStateChanged' ,
743797 {
744798 state : WebSocketState . CONNECTED ,
@@ -805,7 +859,7 @@ describe('AccountActivityService', () => {
805859 } ) ;
806860
807861 // Publish account change event on root messenger
808- await rootMessenger . publish (
862+ rootMessenger . publish (
809863 'AccountsController:selectedAccountChange' ,
810864 newAccount ,
811865 ) ;
@@ -843,7 +897,7 @@ describe('AccountActivityService', () => {
843897 } ) ;
844898
845899 // Publish account change event on root messenger
846- await rootMessenger . publish (
900+ rootMessenger . publish (
847901 'AccountsController:selectedAccountChange' ,
848902 newAccount ,
849903 ) ;
0 commit comments