{"version":3,"file":"providers.mjs","sourceRoot":"","sources":["../../src/tests/providers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Bip44Account } from '@metamask/account-api';\nimport {\n  BtcScope,\n  EthScope,\n  SolScope,\n  TrxScope,\n  XlmScope,\n} from '@metamask/keyring-api';\nimport type { KeyringAccount } from '@metamask/keyring-api';\nimport type { KeyringCapabilities } from '@metamask/keyring-api/v2';\n\nimport { AccountProviderWrapper, EvmAccountProvider } from '../providers';\nimport { GroupIndexRange } from '../utils';\n\nexport type MockAccountProvider = {\n  mockAccounts: KeyringAccount[];\n  accounts: Set<KeyringAccount['id']>;\n  capabilities: KeyringCapabilities;\n  constructor: jest.Mock;\n  alignAccounts: jest.Mock;\n  init: jest.Mock;\n  resyncAccounts: jest.Mock;\n  getAccount: jest.Mock;\n  getAccounts: jest.Mock;\n  createAccounts: jest.Mock;\n  deleteAccount: jest.Mock;\n  discoverAccounts: jest.Mock;\n  isAccountCompatible: jest.Mock;\n  isAligned: jest.Mock;\n  getName: jest.Mock;\n  isEnabled: boolean;\n  isDisabled: jest.Mock;\n  setEnabled: jest.Mock;\n};\n\nexport function makeMockAccountProvider(\n  accounts: KeyringAccount[] = [],\n): MockAccountProvider {\n  return {\n    mockAccounts: accounts,\n    accounts: new Set(),\n    capabilities: {\n      scopes: [\n        SolScope.Devnet,\n        SolScope.Testnet,\n        BtcScope.Testnet,\n        TrxScope.Shasta,\n        XlmScope.Testnet,\n        EthScope.Eoa,\n      ],\n      bip44: { deriveIndex: true },\n    },\n    constructor: jest.fn(),\n    alignAccounts: jest.fn(),\n    init: jest.fn(),\n    resyncAccounts: jest.fn(),\n    getAccount: jest.fn(),\n    getAccounts: jest.fn(),\n    createAccounts: jest.fn(),\n    deleteAccount: jest.fn(),\n    discoverAccounts: jest.fn(),\n    isAccountCompatible: jest.fn(),\n    isAligned: jest.fn().mockReturnValue(false),\n    getName: jest.fn(),\n    isDisabled: jest.fn(),\n    setEnabled: jest.fn(),\n    isEnabled: true,\n  };\n}\n\nexport function setupBip44AccountProvider({\n  name = 'Mocked Provider',\n  accounts,\n  mocks = makeMockAccountProvider(),\n  index,\n}: {\n  name?: string;\n  mocks?: MockAccountProvider;\n  accounts: KeyringAccount[];\n  filter?: (account: KeyringAccount) => boolean;\n  index?: number;\n}): MockAccountProvider {\n  // You can mock this and all other mocks will re-use that list\n  // of accounts.\n  mocks.mockAccounts = accounts;\n  mocks.accounts = new Set(accounts.map((account) => account.id));\n  // Toggle enabled state only\n  mocks.setEnabled.mockImplementation((enabled: boolean) => {\n    mocks.isEnabled = enabled;\n  });\n  mocks.isDisabled.mockImplementation(() => !mocks.isEnabled);\n\n  const getAccounts = (): KeyringAccount[] =>\n    mocks.mockAccounts.filter((account) =>\n      [...mocks.accounts].includes(account.id),\n    );\n\n  mocks.getName.mockImplementation(() => name);\n\n  mocks.getAccounts.mockImplementation(getAccounts);\n  mocks.getAccount.mockImplementation(\n    (id: Bip44Account<KeyringAccount>['id']) =>\n      // Assuming this never fails.\n      getAccounts().find((account) => account.id === id),\n  );\n  mocks.createAccounts.mockResolvedValue([]);\n  mocks.init.mockImplementation(\n    (accountIds: Bip44Account<KeyringAccount>['id'][]) => {\n      accountIds.forEach((id) => mocks.accounts.add(id));\n    },\n  );\n\n  mocks.isAligned.mockImplementation(\n    (\n      _context: { entropySource: string; groupIndex: number },\n      accountIds: string[],\n    ) =>\n      accountIds.length >= 1 &&\n      accountIds.every((id) => mocks.accounts.has(id)),\n  );\n\n  if (index === 0) {\n    // Make the first provider to always be an `EvmAccountProvider`, since we\n    // check for this pre-condition in some methods.\n    Object.setPrototypeOf(mocks, EvmAccountProvider.prototype);\n  }\n\n  if (index !== 0) {\n    Object.setPrototypeOf(mocks, AccountProviderWrapper.prototype);\n  }\n\n  return mocks;\n}\n\n/**\n * Helper to mock a single createAccounts call while updating the provider's\n * internal state so subsequent getAccount/getAccounts can resolve the accounts.\n *\n * @param provider - The mock provider whose createAccounts call to mock.\n * @param created - The accounts to be returned and persisted in the mock state.\n */\nexport function mockCreateAccountsOnce(\n  provider: MockAccountProvider,\n  created: KeyringAccount[],\n): void {\n  provider.createAccounts.mockImplementationOnce(async () => {\n    // Add newly created accounts to the provider's internal store\n    for (const acc of created) {\n      if (!provider.mockAccounts.some((a) => a.id === acc.id)) {\n        provider.mockAccounts.push(acc);\n      }\n    }\n    // Merge IDs into the visible list used by getAccounts/getAccount\n    const ids = created.map((a) => a.id);\n    for (const id of ids) {\n      provider.accounts.add(id);\n    }\n\n    return created;\n  });\n}\n\n/**\n * Helper to convert a group index range to an array of group indices, inclusive of the\n * start and end indices.\n *\n * @param range - The range.\n * @param range.from - The starting index of the range (inclusive).\n * @param range.to - The ending index of the range (inclusive).\n * @returns An array of group indices from `from` to `to`, inclusive.\n */\nexport function toGroupIndexRangeArray({\n  from = 0,\n  to,\n}: GroupIndexRange): number[] {\n  return Array.from({ length: to - from + 1 }, (_, i) => from + i);\n}\n"]}