Skip to content

Commit 183dade

Browse files
committed
feat: add missing test coverage
1 parent 92fb0cd commit 183dade

2 files changed

Lines changed: 197 additions & 0 deletions

File tree

app/scripts/messenger-client-init/confirmations/transaction-controller-init.test.ts

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import {
1010
TransactionControllerOptions,
1111
TransactionStatus,
1212
PublishHook,
13+
PublishBatchHookRequest,
14+
PublishBatchHookTransaction,
1315
} from '@metamask/transaction-controller';
1416
import { TransactionPayPublishHook } from '@metamask/transaction-pay-controller';
1517
import {
@@ -581,4 +583,165 @@ describe('Transaction Controller Init', () => {
581583
});
582584
});
583585
});
586+
587+
describe('publishBatch hook', () => {
588+
const mockTransactionMeta: TransactionMeta = {
589+
id: 'batch-tx-last',
590+
chainId: CHAIN_ID_MOCK,
591+
status: TransactionStatus.approved,
592+
time: Date.now(),
593+
txParams: {
594+
from: '0x0000000000000000000000000000000000000000',
595+
},
596+
networkClientId: 'test-network',
597+
};
598+
599+
it('calls upsertTransactionUIMetricsFragment with sentinel_stx for each batch tx with an id on STX success', async () => {
600+
jest
601+
.mocked(smartTransactionsModule.getSmartTransactionCommonParams)
602+
.mockReturnValue({
603+
isSmartTransaction: true,
604+
featureFlags: {
605+
extensionReturnTxHashAsap: false,
606+
extensionReturnTxHashAsapBatch: false,
607+
extensionSkipSmartTransactionStatusPage: false,
608+
mobileActive: false,
609+
extensionActive: false,
610+
},
611+
isHardwareWalletAccount: false,
612+
});
613+
614+
jest
615+
.mocked(smartTransactionsModule.submitBatchSmartTransactionHook)
616+
.mockResolvedValue({ results: [] });
617+
618+
const upsertFragmentMock = jest.fn();
619+
const requestMock = buildInitRequestMock();
620+
requestMock.getTransactionMetricsRequest.mockReturnValue({
621+
upsertTransactionUIMetricsFragment: upsertFragmentMock,
622+
} as unknown as ReturnType<
623+
typeof requestMock.getTransactionMetricsRequest
624+
>);
625+
626+
TransactionControllerInit(requestMock);
627+
628+
const { hooks } = transactionControllerClassMock.mock.calls[0][0];
629+
const controllerInstance =
630+
transactionControllerClassMock.mock.instances[0];
631+
// @ts-expect-error Partial mock state
632+
controllerInstance.state = {
633+
transactions: [mockTransactionMeta],
634+
};
635+
636+
await hooks?.publishBatch?.({
637+
transactions: [
638+
{ id: 'batch-tx-1' } as unknown as PublishBatchHookTransaction,
639+
{ id: 'batch-tx-last' } as unknown as PublishBatchHookTransaction,
640+
],
641+
} as unknown as PublishBatchHookRequest);
642+
643+
expect(upsertFragmentMock).toHaveBeenCalledTimes(2);
644+
expect(upsertFragmentMock).toHaveBeenCalledWith('batch-tx-1', {
645+
// eslint-disable-next-line @typescript-eslint/naming-convention
646+
properties: { transaction_submission_method: 'sentinel_stx' },
647+
});
648+
expect(upsertFragmentMock).toHaveBeenCalledWith('batch-tx-last', {
649+
// eslint-disable-next-line @typescript-eslint/naming-convention
650+
properties: { transaction_submission_method: 'sentinel_stx' },
651+
});
652+
});
653+
654+
it('skips upsertTransactionUIMetricsFragment for batch txs without an id', async () => {
655+
jest
656+
.mocked(smartTransactionsModule.getSmartTransactionCommonParams)
657+
.mockReturnValue({
658+
isSmartTransaction: true,
659+
featureFlags: {
660+
extensionReturnTxHashAsap: false,
661+
extensionReturnTxHashAsapBatch: false,
662+
extensionSkipSmartTransactionStatusPage: false,
663+
mobileActive: false,
664+
extensionActive: false,
665+
},
666+
isHardwareWalletAccount: false,
667+
});
668+
669+
jest
670+
.mocked(smartTransactionsModule.submitBatchSmartTransactionHook)
671+
.mockResolvedValue({ results: [] });
672+
673+
const upsertFragmentMock = jest.fn();
674+
const requestMock = buildInitRequestMock();
675+
requestMock.getTransactionMetricsRequest.mockReturnValue({
676+
upsertTransactionUIMetricsFragment: upsertFragmentMock,
677+
} as unknown as ReturnType<
678+
typeof requestMock.getTransactionMetricsRequest
679+
>);
680+
681+
TransactionControllerInit(requestMock);
682+
683+
const { hooks } = transactionControllerClassMock.mock.calls[0][0];
684+
const controllerInstance =
685+
transactionControllerClassMock.mock.instances[0];
686+
// @ts-expect-error Partial mock state
687+
controllerInstance.state = {
688+
transactions: [mockTransactionMeta],
689+
};
690+
691+
await hooks?.publishBatch?.({
692+
transactions: [
693+
{} as unknown as PublishBatchHookTransaction,
694+
{ id: 'batch-tx-last' } as unknown as PublishBatchHookTransaction,
695+
],
696+
} as unknown as PublishBatchHookRequest);
697+
698+
expect(upsertFragmentMock).toHaveBeenCalledTimes(1);
699+
expect(upsertFragmentMock).toHaveBeenCalledWith('batch-tx-last', {
700+
// eslint-disable-next-line @typescript-eslint/naming-convention
701+
properties: { transaction_submission_method: 'sentinel_stx' },
702+
});
703+
});
704+
705+
it('does not call upsertTransactionUIMetricsFragment when publishBatchHook returns undefined', async () => {
706+
jest
707+
.mocked(smartTransactionsModule.getSmartTransactionCommonParams)
708+
.mockReturnValue({
709+
isSmartTransaction: false,
710+
featureFlags: {
711+
extensionReturnTxHashAsap: false,
712+
extensionReturnTxHashAsapBatch: false,
713+
extensionSkipSmartTransactionStatusPage: false,
714+
mobileActive: false,
715+
extensionActive: false,
716+
},
717+
isHardwareWalletAccount: false,
718+
});
719+
720+
const upsertFragmentMock = jest.fn();
721+
const requestMock = buildInitRequestMock();
722+
requestMock.getTransactionMetricsRequest.mockReturnValue({
723+
upsertTransactionUIMetricsFragment: upsertFragmentMock,
724+
} as unknown as ReturnType<
725+
typeof requestMock.getTransactionMetricsRequest
726+
>);
727+
728+
TransactionControllerInit(requestMock);
729+
730+
const { hooks } = transactionControllerClassMock.mock.calls[0][0];
731+
const controllerInstance =
732+
transactionControllerClassMock.mock.instances[0];
733+
// @ts-expect-error Partial mock state
734+
controllerInstance.state = {
735+
transactions: [mockTransactionMeta],
736+
};
737+
738+
await hooks?.publishBatch?.({
739+
transactions: [
740+
{ id: 'batch-tx-last' } as unknown as PublishBatchHookTransaction,
741+
],
742+
} as unknown as PublishBatchHookRequest);
743+
744+
expect(upsertFragmentMock).not.toHaveBeenCalled();
745+
});
746+
});
584747
});

app/scripts/metamask-controller.test.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,23 @@ jest.mock('../../shared/lib/environment', () => ({
334334
getEnabledAdvancedPermissions: jest.fn(() => []),
335335
}));
336336

337+
jest.mock('../../shared/lib/selectors/smart-transactions', () => {
338+
const actual = jest.requireActual(
339+
'../../shared/lib/selectors/smart-transactions',
340+
);
341+
return {
342+
...actual,
343+
// Plain implementation avoids Reselect identity-function console warnings when
344+
// getTransactionMetricsRequest tests call through MetaMaskController.
345+
getSmartTransactionsPreferenceEnabled: (state) => {
346+
const preferences = state?.metamask?.preferences ?? {};
347+
const optIn = preferences.smartTransactionsOptInStatus;
348+
const DEFAULT_SMART_TRANSACTIONS_ENABLED = true;
349+
return optIn ?? DEFAULT_SMART_TRANSACTIONS_ENABLED;
350+
},
351+
};
352+
});
353+
337354
jest.mock('./lib/forwardRequestToSnap', () => ({
338355
forwardRequestToSnap: jest.fn().mockResolvedValue({}),
339356
}));
@@ -1042,6 +1059,23 @@ describe('MetaMaskController', () => {
10421059
});
10431060
});
10441061

1062+
describe('getTransactionMetricsRequest', () => {
1063+
it('getSmartTransactionsPreferenceEnabled returns selector result from metamask state', () => {
1064+
metamaskController.preferencesController.update((state) => {
1065+
state.preferences.smartTransactionsOptInStatus = false;
1066+
});
1067+
const { getSmartTransactionsPreferenceEnabled } =
1068+
metamaskController.getTransactionMetricsRequest();
1069+
expect(getSmartTransactionsPreferenceEnabled()).toBe(false);
1070+
});
1071+
1072+
it('getSmartTransactionsEnabled returns selector result for a given chainId', () => {
1073+
const { getSmartTransactionsEnabled } =
1074+
metamaskController.getTransactionMetricsRequest();
1075+
expect(getSmartTransactionsEnabled(MAINNET_CHAIN_ID)).toBe(false);
1076+
});
1077+
});
1078+
10451079
describe('submitPassword', () => {
10461080
it('removes any identities that do not correspond to known accounts.', async () => {
10471081
const localMetaMaskController = new MetaMaskController({

0 commit comments

Comments
 (0)