mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-23 18:41:38 +01:00
0033a64e5d
The connected accounts are now ordered by keyring controller order whenever the `lastSelected` time is equal. This ensures the order is identical to what connected sites see. This is especially important when no accounts have been selected, as it ensures the correct account is marked as the "Primary" account.
446 lines
15 KiB
JavaScript
446 lines
15 KiB
JavaScript
import assert from 'assert'
|
|
import {
|
|
getConnectedDomainsForSelectedAddress,
|
|
getOrderedConnectedAccountsForActiveTab,
|
|
getPermissionsForActiveTab,
|
|
} from '../permissions'
|
|
|
|
describe('selectors', function () {
|
|
|
|
describe('getConnectedDomainsForSelectedAddress', function () {
|
|
it('should return the list of connected domains when there is 1 connected account', function () {
|
|
const mockState = {
|
|
metamask: {
|
|
selectedAddress: '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
domainMetadata: {
|
|
'peepeth.com': {
|
|
'icon': 'https://peepeth.com/favicon-32x32.png',
|
|
'name': 'Peepeth',
|
|
},
|
|
'remix.ethereum.org': {
|
|
'icon': 'https://remix.ethereum.org/icon.png',
|
|
'name': 'Remix - Ethereum IDE',
|
|
},
|
|
},
|
|
domains: {
|
|
'peepeth.com': {
|
|
'permissions': [
|
|
{
|
|
'@context': [
|
|
'https://github.com/MetaMask/rpc-cap',
|
|
],
|
|
'caveats': [
|
|
{
|
|
'name': 'exposedAccounts',
|
|
'type': 'filterResponse',
|
|
'value': [
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
],
|
|
},
|
|
],
|
|
'date': 1585676177970,
|
|
'id': '840d72a0-925f-449f-830a-1aa1dd5ce151',
|
|
'invoker': 'peepeth.com',
|
|
'parentCapability': 'eth_accounts',
|
|
},
|
|
],
|
|
},
|
|
'remix.ethereum.org': {
|
|
'permissions': [
|
|
{
|
|
'@context': [
|
|
'https://github.com/MetaMask/rpc-cap',
|
|
],
|
|
'caveats': [
|
|
{
|
|
'type': 'filterResponse',
|
|
'value': [
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
],
|
|
'name': 'exposedAccounts',
|
|
},
|
|
],
|
|
'date': 1585685128948,
|
|
'id': '6b9615cc-64e4-4317-afab-3c4f8ee0244a',
|
|
'invoker': 'remix.ethereum.org',
|
|
'parentCapability': 'eth_accounts',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
}
|
|
const extensionId = undefined
|
|
assert.deepEqual(getConnectedDomainsForSelectedAddress(mockState), [{
|
|
extensionId,
|
|
icon: 'https://peepeth.com/favicon-32x32.png',
|
|
key: 'peepeth.com',
|
|
name: 'Peepeth',
|
|
}, {
|
|
extensionId,
|
|
name: 'Remix - Ethereum IDE',
|
|
icon: 'https://remix.ethereum.org/icon.png',
|
|
key: 'remix.ethereum.org',
|
|
}])
|
|
})
|
|
|
|
it('should return the list of connected domains when there are 2 connected accounts', function () {
|
|
const mockState = {
|
|
metamask: {
|
|
selectedAddress: '0x7250739de134d33ec7ab1ee592711e15098c9d2d',
|
|
domainMetadata: {
|
|
'peepeth.com': {
|
|
'icon': 'https://peepeth.com/favicon-32x32.png',
|
|
'name': 'Peepeth',
|
|
},
|
|
'remix.ethereum.org': {
|
|
'icon': 'https://remix.ethereum.org/icon.png',
|
|
'name': 'Remix - Ethereum IDE',
|
|
},
|
|
},
|
|
domains: {
|
|
'peepeth.com': {
|
|
'permissions': [
|
|
{
|
|
'@context': [
|
|
'https://github.com/MetaMask/rpc-cap',
|
|
],
|
|
'caveats': [
|
|
{
|
|
'name': 'exposedAccounts',
|
|
'type': 'filterResponse',
|
|
'value': [
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
],
|
|
},
|
|
],
|
|
'date': 1585676177970,
|
|
'id': '840d72a0-925f-449f-830a-1aa1dd5ce151',
|
|
'invoker': 'peepeth.com',
|
|
'parentCapability': 'eth_accounts',
|
|
},
|
|
],
|
|
},
|
|
'remix.ethereum.org': {
|
|
'permissions': [
|
|
{
|
|
'@context': [
|
|
'https://github.com/MetaMask/rpc-cap',
|
|
],
|
|
'caveats': [
|
|
{
|
|
'type': 'filterResponse',
|
|
'value': [
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
'0x7250739de134d33ec7ab1ee592711e15098c9d2d',
|
|
],
|
|
'name': 'exposedAccounts',
|
|
},
|
|
],
|
|
'date': 1585685128948,
|
|
'id': '6b9615cc-64e4-4317-afab-3c4f8ee0244a',
|
|
'invoker': 'remix.ethereum.org',
|
|
'parentCapability': 'eth_accounts',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
}
|
|
const extensionId = undefined
|
|
assert.deepEqual(getConnectedDomainsForSelectedAddress(mockState), [{
|
|
extensionId,
|
|
name: 'Remix - Ethereum IDE',
|
|
icon: 'https://remix.ethereum.org/icon.png',
|
|
key: 'remix.ethereum.org',
|
|
}])
|
|
})
|
|
})
|
|
|
|
describe('getConnectedAccountsForActiveTab', function () {
|
|
const mockState = {
|
|
activeTab: {
|
|
'title': 'Eth Sign Tests',
|
|
'origin': 'remix.ethereum.org',
|
|
'protocol': 'https:',
|
|
'url': 'https://remix.ethereum.org/',
|
|
},
|
|
metamask: {
|
|
accounts: {
|
|
0x7250739de134d33ec7ab1ee592711e15098c9d2d: {
|
|
address: '0x7250739de134d33ec7ab1ee592711e15098c9d2d',
|
|
},
|
|
0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5: {
|
|
address: '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
},
|
|
0xb3958fb96c8201486ae20be1d5c9f58083df343a: {
|
|
address: '0xb3958fb96c8201486ae20be1d5c9f58083df343a',
|
|
},
|
|
0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc: {
|
|
address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
|
|
},
|
|
0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4: {
|
|
address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
|
|
},
|
|
},
|
|
cachedBalances: {},
|
|
domains: {
|
|
'remix.ethereum.org': {
|
|
'permissions': [
|
|
{
|
|
'@context': [
|
|
'https://github.com/MetaMask/rpc-cap',
|
|
],
|
|
'caveats': [
|
|
{
|
|
'name': 'exposedAccounts',
|
|
'type': 'filterResponse',
|
|
'value': [
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
'0x7250739de134d33ec7ab1ee592711e15098c9d2d',
|
|
'0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
|
|
'0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
|
|
'0xb3958fb96c8201486ae20be1d5c9f58083df343a',
|
|
],
|
|
},
|
|
],
|
|
'date': 1586359844177,
|
|
'id': '3aa65a8b-3bcb-4944-941b-1baa5fe0ed8b',
|
|
'invoker': 'remix.ethereum.org',
|
|
'parentCapability': 'eth_accounts',
|
|
},
|
|
],
|
|
},
|
|
'peepeth.com': {
|
|
'permissions': [
|
|
{
|
|
'@context': [
|
|
'https://github.com/MetaMask/rpc-cap',
|
|
],
|
|
'caveats': [
|
|
{
|
|
'name': 'exposedAccounts',
|
|
'type': 'filterResponse',
|
|
'value': [
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
],
|
|
},
|
|
],
|
|
'date': 1585676177970,
|
|
'id': '840d72a0-925f-449f-830a-1aa1dd5ce151',
|
|
'invoker': 'peepeth.com',
|
|
'parentCapability': 'eth_accounts',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
identities: {
|
|
'0x7250739de134d33ec7ab1ee592711e15098c9d2d': {
|
|
'address': '0x7250739de134d33ec7ab1ee592711e15098c9d2d',
|
|
'name': 'Really Long Name That Should Be Truncated',
|
|
},
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': {
|
|
'address': '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
lastSelected: 1586359844192,
|
|
'name': 'Account 1',
|
|
},
|
|
'0xb3958fb96c8201486ae20be1d5c9f58083df343a': {
|
|
lastSelected: 1586359844193,
|
|
'address': '0xb3958fb96c8201486ae20be1d5c9f58083df343a',
|
|
'name': 'Account 2',
|
|
},
|
|
'0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': {
|
|
'address': '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
|
|
lastSelected: 1586359844192,
|
|
'name': 'Account 3',
|
|
},
|
|
'0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4': {
|
|
address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
|
|
name: 'Account 4',
|
|
},
|
|
},
|
|
keyrings: [{
|
|
accounts: [
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
'0x7250739de134d33ec7ab1ee592711e15098c9d2d',
|
|
'0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
|
|
'0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
|
|
'0xb3958fb96c8201486ae20be1d5c9f58083df343a',
|
|
],
|
|
}],
|
|
permissionsHistory: {
|
|
'remix.ethereum.org': {
|
|
'eth_accounts': {
|
|
'accounts': {
|
|
'0x7250739de134d33ec7ab1ee592711e15098c9d2d': 1586359844192,
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': 1586359844192,
|
|
'0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4': 1586359844192,
|
|
'0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': 1586359844192,
|
|
'0xb3958fb96c8201486ae20be1d5c9f58083df343a': 1586359844192,
|
|
},
|
|
'lastApproved': 1586359844192,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
it('should return connected accounts sorted by last selected, then by keyring controller order', function () {
|
|
assert.deepEqual(getOrderedConnectedAccountsForActiveTab(mockState), [
|
|
{
|
|
address: '0xb3958fb96c8201486ae20be1d5c9f58083df343a',
|
|
name: 'Account 2',
|
|
lastActive: 1586359844192,
|
|
lastSelected: 1586359844193,
|
|
},
|
|
{
|
|
address: '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
name: 'Account 1',
|
|
lastActive: 1586359844192,
|
|
lastSelected: 1586359844192,
|
|
},
|
|
{
|
|
address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
|
|
name: 'Account 3',
|
|
lastActive: 1586359844192,
|
|
lastSelected: 1586359844192,
|
|
},
|
|
{
|
|
address: '0x7250739de134d33ec7ab1ee592711e15098c9d2d',
|
|
name: 'Really Long Name That Should Be Truncated',
|
|
lastActive: 1586359844192,
|
|
},
|
|
{
|
|
address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
|
|
name: 'Account 4',
|
|
lastActive: 1586359844192,
|
|
},
|
|
])
|
|
})
|
|
})
|
|
|
|
describe('getPermissionsForActiveTab', function () {
|
|
const mockState = {
|
|
activeTab: {
|
|
'title': 'Eth Sign Tests',
|
|
'origin': 'remix.ethereum.org',
|
|
'protocol': 'https:',
|
|
'url': 'https://remix.ethereum.org/',
|
|
},
|
|
metamask: {
|
|
identities: {
|
|
'0x7250739de134d33ec7ab1ee592711e15098c9d2d': {
|
|
'address': '0x7250739de134d33ec7ab1ee592711e15098c9d2d',
|
|
'name': 'Really Long Name That Should Be Truncated',
|
|
},
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': {
|
|
'address': '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
'name': 'Account 1',
|
|
},
|
|
'0xb3958fb96c8201486ae20be1d5c9f58083df343a': {
|
|
'address': '0xb3958fb96c8201486ae20be1d5c9f58083df343a',
|
|
'name': 'Account 2',
|
|
},
|
|
},
|
|
domains: {
|
|
'remix.ethereum.org': {
|
|
'permissions': [
|
|
{
|
|
'@context': [
|
|
'https://github.com/MetaMask/rpc-cap',
|
|
],
|
|
'caveats': [
|
|
{
|
|
'name': 'exposedAccounts',
|
|
'type': 'filterResponse',
|
|
'value': [
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
'0x7250739de134d33ec7ab1ee592711e15098c9d2d',
|
|
],
|
|
},
|
|
],
|
|
'date': 1586359844177,
|
|
'id': '3aa65a8b-3bcb-4944-941b-1baa5fe0ed8b',
|
|
'invoker': 'remix.ethereum.org',
|
|
'parentCapability': 'eth_accounts',
|
|
},
|
|
],
|
|
},
|
|
'peepeth.com': {
|
|
'permissions': [
|
|
{
|
|
'@context': [
|
|
'https://github.com/MetaMask/rpc-cap',
|
|
],
|
|
'caveats': [
|
|
{
|
|
'name': 'exposedAccounts',
|
|
'type': 'filterResponse',
|
|
'value': [
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
],
|
|
},
|
|
],
|
|
'date': 1585676177970,
|
|
'id': '840d72a0-925f-449f-830a-1aa1dd5ce151',
|
|
'invoker': 'peepeth.com',
|
|
'parentCapability': 'eth_accounts',
|
|
},
|
|
],
|
|
},
|
|
'uniswap.exchange': {
|
|
'permissions': [
|
|
{
|
|
'@context': [
|
|
'https://github.com/MetaMask/rpc-cap',
|
|
],
|
|
'caveats': [
|
|
{
|
|
'name': 'exposedAccounts',
|
|
'type': 'filterResponse',
|
|
'value': [
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5',
|
|
],
|
|
},
|
|
],
|
|
'date': 1585616816623,
|
|
'id': 'ce625215-f2e9-48e7-93ca-21ba193244ff',
|
|
'invoker': 'uniswap.exchange',
|
|
'parentCapability': 'eth_accounts',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
domainMetadata: {
|
|
'remix.ethereum.org': {
|
|
'icon': 'https://remix.ethereum.org/icon.png',
|
|
'name': 'Remix - Ethereum IDE',
|
|
},
|
|
},
|
|
permissionsHistory: {
|
|
'remix.ethereum.org': {
|
|
'eth_accounts': {
|
|
'accounts': {
|
|
'0x7250739de134d33ec7ab1ee592711e15098c9d2d': 1586359844192,
|
|
'0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': 1586359844192,
|
|
},
|
|
'lastApproved': 1586359844192,
|
|
},
|
|
},
|
|
},
|
|
permissionsDescriptions: {
|
|
'eth_accounts': "View the addresses of the user's chosen accounts.",
|
|
},
|
|
},
|
|
}
|
|
|
|
it('should return a list of permissions strings', function () {
|
|
assert.deepEqual(getPermissionsForActiveTab(mockState), [{
|
|
key: 'eth_accounts',
|
|
description: "View the addresses of the user's chosen accounts.",
|
|
}])
|
|
})
|
|
})
|
|
|
|
})
|