diff --git a/e2e/helpers/DefaultTestEnv.ts b/e2e/helpers/DefaultTestEnv.ts index bdf69eda..d342c0b8 100644 --- a/e2e/helpers/DefaultTestEnv.ts +++ b/e2e/helpers/DefaultTestEnv.ts @@ -127,7 +127,9 @@ export class DefaultTestEnv implements TestEnv { `--disable-extensions-except=${this.options.extensionDirPath}`, `--load-extension=${this.options.extensionDirPath}`, ], + permissions: ['clipboard-read'], }); + this._context.setDefaultTimeout(5000); let [background] = this.context.serviceWorkers(); if (!background) background = await this.context.waitForEvent('serviceworker'); @@ -138,8 +140,7 @@ export class DefaultTestEnv implements TestEnv { await asyncSleep(200); await background.evaluate(async (data) => { - // @ts-ignore - await chrome.storage.local.set(data); + await chrome.storage.local.set(data as Record); }, getDefaultStorageData()); } } @@ -184,8 +185,7 @@ export class DefaultTestEnv implements TestEnv { request: async (payload) => { const res = thePage.evaluate(async (payload) => { await new Promise((resolve) => setTimeout(resolve, 10)); - // @ts-ignore - return window.ckb.request(payload); + return window.ckb.request(payload as never); }, payload); if (this.options.autoApproveEnable && payload.method === 'wallet_enable') { diff --git a/e2e/mock-page-with-disallowed-iframe/index.html b/e2e/mock-page-with-disallowed-iframe/index.html new file mode 100644 index 00000000..2845f179 --- /dev/null +++ b/e2e/mock-page-with-disallowed-iframe/index.html @@ -0,0 +1,18 @@ + + + + Mock E2E Phishing Page + + + + + +

+ + + + diff --git a/e2e/mock-page-with-iframe/index.html b/e2e/mock-page-with-iframe/index.html new file mode 100644 index 00000000..f63a82d3 --- /dev/null +++ b/e2e/mock-page-with-iframe/index.html @@ -0,0 +1,10 @@ + + + + Mock E2E Phishing Page + + +
Hello
+ + + diff --git a/e2e/tests/account-detail.test.ts b/e2e/tests/account-detail.test.ts new file mode 100644 index 00000000..23b5910b --- /dev/null +++ b/e2e/tests/account-detail.test.ts @@ -0,0 +1,43 @@ +import { DefaultTestEnv } from '../helpers'; + +DefaultTestEnv.setupTest({ initWalletWithDefaults: true }); + +describe('Show wallet details', function () { + it('should show nick name for wallet', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + await page.getByText(testEnv.defaultE2eData.nickname).waitFor(); + }); + + it('should show disconnected for the wallet', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + await page.getByText('Disconnected').waitFor(); + }); + it('should show whitelist sites for the wallet', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + await page.getByRole('button', { name: 'Whitelist Sites' }).click(); + await page.getByText('No whitelist sites found.').waitFor(); + }); + it('should show networks list for the wallet', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + await page.getByRole('button', { name: 'Network' }).click(); + await page.getByText('Mainnet').waitFor(); + await page.getByText('Testnet').waitFor(); + }); + + it('should show feedback for the wallet', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + await page.getByRole('link', { name: 'Feedback' }).click(); + await page.waitForTimeout(1000); + expect(testEnv.context.pages().some((page) => page.url().includes('ckb-js/nexus/issues'))).toBe(true); + }); +}); diff --git a/e2e/tests/add-network.test.ts b/e2e/tests/add-network.test.ts new file mode 100644 index 00000000..c787ad40 --- /dev/null +++ b/e2e/tests/add-network.test.ts @@ -0,0 +1,62 @@ +import { DefaultTestEnv } from '../helpers'; + +DefaultTestEnv.setupTest({ initWalletWithDefaults: true }); + +describe('add network', function () { + it('should work when the add name too long', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + await page.getByRole('button', { name: 'Network' }).click(); + await page.getByRole('button', { name: 'Add Network' }).click(); + + const tooLongName = + 'too too too too too long long long long long long long long long long long long long long long long long long long long long long long long'; + await page.getByLabel('Name').fill(tooLongName); + await page.getByLabel('URL').fill('https://testnet.ckbapp.dev/'); + await page.getByRole('button', { name: 'Add' }).click(); + await page.getByText(tooLongName).waitFor(); + }); + + it('should work when the add name exist', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + await page.getByRole('button', { name: 'Network' }).click(); + await page.getByRole('button', { name: 'Add Network' }).click(); + + const existName = 'Testnet'; + await page.getByLabel('Name').fill(existName); + await page.getByLabel('URL').fill('https://testnet.ckbapp.dev/'); + await page.getByRole('button', { name: 'Add' }).click(); + await page.getByText(existName).allInnerTexts(); + }); + + it('should work when the add url is not ckb rpc', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + await page.getByRole('button', { name: 'Network' }).click(); + await page.getByRole('button', { name: 'Add Network' }).click(); + + const randName = 'rand test name'; + await page.getByLabel('Name').fill(randName); + await page.getByLabel('URL').fill('https://www.baidu.com'); + await page.getByRole('button', { name: 'Add' }).click(); + await page.getByText(randName).allInnerTexts(); + }); + + it('should work when the add url is ckb rpc', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + await page.getByRole('button', { name: 'Network' }).click(); + await page.getByRole('button', { name: 'Add Network' }).click(); + + const randName = 'rand name'; + await page.getByLabel('Name').fill(randName); + await page.getByLabel('URL').fill('https://testnet.ckbapp.dev/'); + await page.getByRole('button', { name: 'Add' }).click(); + await page.getByText(randName).allInnerTexts(); + }); +}); diff --git a/e2e/tests/add-whitelist-site.test.ts b/e2e/tests/add-whitelist-site.test.ts new file mode 100644 index 00000000..08ad906c --- /dev/null +++ b/e2e/tests/add-whitelist-site.test.ts @@ -0,0 +1,99 @@ +import { DefaultTestEnv } from '../helpers'; +import { asyncSleep } from '@nexus-wallet/utils'; + +DefaultTestEnv.setupTest({ initWalletWithDefaults: true }); +describe('add whitelist site', function () { + it('should request failed before add whitelist', async () => { + try { + await ckb.request({ method: 'wallet_fullOwnership_getOffChainLocks' }); + } catch (error) { + expect(`${error}`).toMatch(/not in the whitelist/); + return; + } + expect('').toBe('failed'); + }); + + /** + * TODO: impl localhost can be visited + */ + it.todo('should work that add localhost url'); + /** + * TODO: impl 192.168 can be visited + */ + it.todo('should work that add 192.168.. url'); + + it('Should wallet_enable work that add url protocol is HTTP', async () => { + const httpUrl = 'http://info.cern.ch'; + await page.goto(httpUrl); + const enableTask = ckb.request({ method: 'wallet_enable' }); + + const notificationPage = await testEnv.getNotificationPage(); + await notificationPage.getByRole('button', { name: 'Connect' }).click(); + + const res = await enableTask; + expect(res.nickname).toBe(testEnv.defaultE2eData.nickname); + }); + + it('Should wallet_enable work that add url protocol is HTTPS', async () => { + const httpsUrl = 'https://github.com'; + await page.goto(httpsUrl); + const enableTask = ckb.request({ method: 'wallet_enable' }); + + const notificationPage = await testEnv.getNotificationPage(); + await notificationPage.getByRole('button', { name: 'Connect' }).click(); + + const res = await enableTask; + expect(res.nickname).toBe(testEnv.defaultE2eData.nickname); + }); + + /** + * skip reason :TODO: check url is in the box + */ + it.skip('should work that add url is too long', async () => { + const tooLongUrl = 'https://mememmememememmemememmememememmemememmememememme.bit.cc/'; + await page.goto(tooLongUrl); + const enableTask = ckb.request({ method: 'wallet_enable' }); + + const notificationPage = await testEnv.getNotificationPage(); + await notificationPage.getByRole('button', { name: 'Connect' }).click(); + + const res = await enableTask; + expect(res.nickname).toBe(testEnv.defaultE2eData.nickname); + }); + + it('should request work after add whitelist ', async () => { + const enableTask = ckb.request({ method: 'wallet_enable' }); + + await asyncSleep(1000); + const notificationPage = await testEnv.getNotificationPage(); + await notificationPage.getByRole('button', { name: 'Connect' }).click(); + + const res = await enableTask; + expect(res.nickname).toBe(testEnv.defaultE2eData.nickname); + + await ckb.request({ method: 'wallet_fullOwnership_getOffChainLocks', params: {} }); + }); + + it('should find url in whitelist after add whitelist', async () => { + const enableTask = ckb.request({ method: 'wallet_enable' }); + + const notificationPage = await testEnv.getNotificationPage(); + await notificationPage.getByRole('button', { name: 'Connect' }).click(); + + const res = await enableTask; + expect(res.nickname).toBe(testEnv.defaultE2eData.nickname); + + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + + await page.getByRole('button', { name: 'Whitelist Sites' }).click(); + // await page.getByRole('').fill(urlTransferDomainName(testEnv.defaultE2eData.localServerUrl)) + await page.getByText(urlTransferDomainName(testEnv.defaultE2eData.localServerUrl)); + }); +}); + +export function urlTransferDomainName(url: string): string { + const match = url.match(/^https?:\/\/([^/]+)/); + return match ? match[1] : ''; +} diff --git a/e2e/tests/change-network.test.ts b/e2e/tests/change-network.test.ts new file mode 100644 index 00000000..3cbc020b --- /dev/null +++ b/e2e/tests/change-network.test.ts @@ -0,0 +1,67 @@ +import { DefaultTestEnv } from '../helpers'; + +DefaultTestEnv.setupTest({ initWalletWithDefaults: true }); + +describe('Change network', function () { + it('should get networkChanged when network change', async () => { + await page.evaluate(() => { + window.ckbNetworkName = ''; + window.ckb.on('networkChanged', (networkName: string) => { + window.ckbNetworkName = networkName; + }); + }); + const extensionIdPage = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await extensionIdPage.goto(`chrome-extension://${extensionId}/popup.html`); + await extensionIdPage.getByRole('button', { name: 'Network' }).click(); + await extensionIdPage.getByText('Mainnet').click(); + let ckbNetworkName = await page.evaluate(() => { + return window.ckbNetworkName; + }); + expect(ckbNetworkName).toBe('ckb'); + await extensionIdPage.getByText('Testnet').click(); + ckbNetworkName = await page.evaluate(() => { + return window.ckbNetworkName; + }); + expect(ckbNetworkName).toBe('ckb_testnet'); + }); + it('should get ckb name that change network is user added', async () => { + const extensionIdPage = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await extensionIdPage.goto(`chrome-extension://${extensionId}/popup.html`); + await extensionIdPage.getByRole('button', { name: 'Network' }).click(); + await extensionIdPage.getByRole('button', { name: 'Add Network' }).click(); + + const randName = 'user test net name'; + await extensionIdPage.getByLabel('Name').fill(randName); + await extensionIdPage.getByLabel('URL').fill('https://testnet.ckbapp.dev/'); + await extensionIdPage.getByRole('button', { name: 'Add' }).click(); + await extensionIdPage.getByText(randName).allInnerTexts(); + + await extensionIdPage.getByRole('button', { name: 'Add Network' }).click(); + const notCkbName = 'user add not ckb test net name'; + await extensionIdPage.getByLabel('Name').fill(notCkbName); + await extensionIdPage.getByLabel('URL').fill('https://github.com'); + await extensionIdPage.getByRole('button', { name: 'Add' }).click(); + await extensionIdPage.getByText(notCkbName).allInnerTexts(); + await page.evaluate(() => { + window.ckbNetworkName = ''; + window.ckb.on('networkChanged', (networkName: string) => { + window.ckbNetworkName = networkName; + }); + }); + await extensionIdPage.getByText(randName).click(); + let ckbNetworkName = await page.evaluate(() => { + return window.ckbNetworkName; + }); + expect(ckbNetworkName).toBe(randName); + + await extensionIdPage.getByText(notCkbName).click(); + + ckbNetworkName = await page.evaluate(() => { + return window.ckbNetworkName; + }); + + expect(ckbNetworkName).toBe(notCkbName); + }); +}); diff --git a/e2e/tests/ckb-getBlockchainInfo.test.ts b/e2e/tests/ckb-getBlockchainInfo.test.ts new file mode 100644 index 00000000..8c8dfbfe --- /dev/null +++ b/e2e/tests/ckb-getBlockchainInfo.test.ts @@ -0,0 +1,87 @@ +import { DefaultTestEnv } from '../helpers'; + +DefaultTestEnv.setupTest({ initWalletWithDefaults: true }); + +describe('ckb getBlockchain info', function () { + it('should throw when the page not in whitelist', async () => { + try { + await ckb.request({ method: 'ckb_getBlockchainInfo' }); + } catch (e) { + expect(`${e}`).toMatch(/is not in the whitelis/); + return; + } + expect('').toBe('failed'); + }); + + it('using switched network when network is changed', async () => { + // add whitelist + const enableTask = ckb.request({ method: 'wallet_enable' }); + + const notificationPage = await testEnv.getNotificationPage(); + await notificationPage.getByRole('button', { name: 'Connect' }).click(); + + const res = await enableTask; + expect(res.nickname).toBe(testEnv.defaultE2eData.nickname); + + // should not ask again when already approved + const res2 = await ckb.request({ method: 'wallet_enable' }); + expect(res2.nickname).toBe(testEnv.defaultE2eData.nickname); + + const changeNetBeforeResponse = await ckb.request({ method: 'ckb_getBlockchainInfo' }); + + expect(changeNetBeforeResponse.chain).toBe('ckb_testnet'); + // change network + const extensionIdPage = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await extensionIdPage.goto(`chrome-extension://${extensionId}/popup.html`); + await extensionIdPage.getByRole('button', { name: 'Network' }).click(); + await extensionIdPage.getByText('Mainnet').click(); + await extensionIdPage.close(); + + const changeNetAfterResponse = await ckb.request({ method: 'ckb_getBlockchainInfo' }); + expect(changeNetAfterResponse.chain).toBe('ckb'); + }); + + it('should throw when the current network is unavailable', async () => { + // add whitelist + const enableTask = ckb.request({ method: 'wallet_enable' }); + + const notificationPage = await testEnv.getNotificationPage(); + await notificationPage.getByRole('button', { name: 'Connect' }).click(); + + const res = await enableTask; + expect(res.nickname).toBe(testEnv.defaultE2eData.nickname); + + // should not ask again when already approved + const res2 = await ckb.request({ method: 'wallet_enable' }); + expect(res2.nickname).toBe(testEnv.defaultE2eData.nickname); + + const changeNetBeforeResponse = await ckb.request({ method: 'ckb_getBlockchainInfo' }); + + expect(changeNetBeforeResponse.chain).toBe('ckb_testnet'); + + const extensionIdPage = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await extensionIdPage.goto(`chrome-extension://${extensionId}/popup.html`); + await extensionIdPage.getByRole('button', { name: 'Network' }).click(); + + // add user network that network is wrong + await extensionIdPage.getByRole('button', { name: 'Add Network' }).click(); + const randName = 'rand name'; + await extensionIdPage.getByLabel('Name').fill(randName); + await extensionIdPage.getByLabel('URL').fill('http://localhost:3000'); + await extensionIdPage.getByRole('button', { name: 'Add' }).click(); + await extensionIdPage.getByText(randName).allInnerTexts(); + + // change network that is wrong + await extensionIdPage.getByText(randName).click(); + await extensionIdPage.close(); + + try { + await ckb.request({ method: 'ckb_getBlockchainInfo' }); + } catch (e) { + return; + } + expect('').toBe('failed'); + }); +}); diff --git a/e2e/tests/create-wallet.test.ts b/e2e/tests/create-wallet.test.ts new file mode 100644 index 00000000..f1893e41 --- /dev/null +++ b/e2e/tests/create-wallet.test.ts @@ -0,0 +1,64 @@ +import { DefaultTestEnv } from '../helpers'; + +DefaultTestEnv.setupTest({ initWalletWithDefaults: false }); + +describe('Create a wallet', function () { + it('clipboard matches the text in the box', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/walletManager.html`); + await page.getByRole('button', { name: 'Create a Wallet' }).click(); + await page.getByRole('button', { name: 'Get Started' }).click(); + await page.getByLabel('A Descriptive Name For Your Wallet').fill(testEnv.defaultE2eData.nickname); + await page.getByRole('button', { name: 'Next' }).click(); + await page.getByLabel('New password').fill(testEnv.defaultE2eData.password); + await page.getByLabel('Confirm password').fill(testEnv.defaultE2eData.password); + await page.getByRole('button', { name: 'Next' }).click(); + await page.getByText('Copy to clipboard').click(); + const clipboard = await page.evaluate('navigator.clipboard.readText()'); + await page.getByText(clipboard).waitFor(); + }); + + it('should warn when the seed order is wrong', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/walletManager.html`); + await page.getByRole('button', { name: 'Create a Wallet' }).click(); + await page.getByRole('button', { name: 'Get Started' }).click(); + await page.getByLabel('A Descriptive Name For Your Wallet').fill(testEnv.defaultE2eData.nickname); + await page.getByRole('button', { name: 'Next' }).click(); + await page.getByLabel('New password').fill(testEnv.defaultE2eData.password); + await page.getByLabel('Confirm password').fill(testEnv.defaultE2eData.password); + await page.getByRole('button', { name: 'Next' }).click(); + await page.getByText('Copy to clipboard').click(); + const clipboard = await page.evaluate('navigator.clipboard.readText()'); + await page.getByRole('button', { name: 'Next' }).click(); + let seedArr = clipboard.split(' '); + seedArr = seedArr.sort(); + for (let i = 0; i < seedArr.length; i++) { + await page.getByText(seedArr[i], { exact: true }).click(); + } + await page.getByRole('button', { name: 'Confirm' }).isDisabled(); + }); + it('should work when the seed order is right', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/walletManager.html`); + await page.getByRole('button', { name: 'Create a Wallet' }).click(); + await page.getByRole('button', { name: 'Get Started' }).click(); + await page.getByLabel('A Descriptive Name For Your Wallet').fill(testEnv.defaultE2eData.nickname); + await page.getByRole('button', { name: 'Next' }).click(); + await page.getByLabel('New password').fill(testEnv.defaultE2eData.password); + await page.getByLabel('Confirm password').fill(testEnv.defaultE2eData.password); + await page.getByRole('button', { name: 'Next' }).click(); + await page.getByText('Copy to clipboard').click(); + const clipboard = await page.evaluate('navigator.clipboard.readText()'); + await page.getByRole('button', { name: 'Next' }).click(); + let seedArr = clipboard.split(' '); + for (let i = 0; i < seedArr.length; i++) { + await page.getByText(seedArr[i], { exact: true }).click(); + } + await page.getByRole('button', { name: 'Confirm' }).click(); + await page.getByRole('button', { name: 'All Done' }).click(); + }); +}); diff --git a/e2e/tests/edit-network.test.ts b/e2e/tests/edit-network.test.ts new file mode 100644 index 00000000..5ea1372d --- /dev/null +++ b/e2e/tests/edit-network.test.ts @@ -0,0 +1,17 @@ +describe('Edit network', function () { + /** + * TODO: impl editing btn can click + * 1. editing a network that is currently in use + * expected + * 1. warn current network is use + */ + it.todo('should warn when editing a network that is currently in use'); + + /** + * TODO: impl editing btn can click + * 1.editing a network that is not currently in use + * expected + * 1. successful + */ + it.todo('should work when editing a network that is not currently in use'); +}); diff --git a/e2e/tests/global.d.ts b/e2e/tests/global.d.ts new file mode 100644 index 00000000..6f529b0f --- /dev/null +++ b/e2e/tests/global.d.ts @@ -0,0 +1,6 @@ +declare global { + interface Window { + ckbNetworkName: string; + } +} +export {}; diff --git a/e2e/tests/iframe-web.test.ts b/e2e/tests/iframe-web.test.ts new file mode 100644 index 00000000..28ce6fd3 --- /dev/null +++ b/e2e/tests/iframe-web.test.ts @@ -0,0 +1,19 @@ +describe('Iframe webpage', function () { + /** + * TODO: impl html can be visited + * html : nexus/e2e/mock-page-with-disallowed-iframe/index.html + * show : `chrome-extension://${extensionId}/popup.html` + * expected + * 1. iframe webpage is blocked + */ + it.todo('should blocked when the iframe webpage link is nexus'); + + /** + * TODO: impl html can be visited + * html : nexus/e2e/mock-page-with-iframe/index.html + * 1. iframe webpage send wallet_enable request + * expected + * 1. nexus think iframe webpage is current webpage + */ + it.todo('the iframe webpage has the same permissions as the current webpage'); +}); diff --git a/e2e/tests/import-wallet.test.ts b/e2e/tests/import-wallet.test.ts new file mode 100644 index 00000000..fffd8bf3 --- /dev/null +++ b/e2e/tests/import-wallet.test.ts @@ -0,0 +1,111 @@ +import { DefaultTestEnv } from '../helpers'; + +DefaultTestEnv.setupTest({ initWalletWithDefaults: false }); + +describe('Import a wallet', () => { + it('should warn when input incorrect BIP39 words', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/walletManager.html`); + + await page.getByRole('button', { name: 'Import a wallet' }).click(); + const wordsArr = '1 2 3 4 5 6 7 8 9 10 11 12'.split(' '); + for (let i = 0; i < wordsArr.length; i++) { + await page.getByLabel(`${i + 1}`, { exact: true }).fill(wordsArr[i]); + } + await page.getByText('Please check your Seed').waitFor(); + await page.getByRole('button', { name: 'Next' }).isDisabled(); + }); + + it('should works with paste 12 mnemonic', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/walletManager.html`); + + await page.getByRole('button', { name: 'Import a wallet' }).click(); + const wordsArr = testEnv.defaultE2eData.mnemonic.split(' '); + for (let i = 0; i < wordsArr.length; i++) { + await page.getByLabel(`${i + 1}`, { exact: true }).fill(wordsArr[i]); + } + await page.getByRole('button', { name: 'Next' }).click(); + }); + + it('should show error message when the input password is too short', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/walletManager.html`); + + await page.getByRole('button', { name: 'Import a wallet' }).click(); + const wordsArr = testEnv.defaultE2eData.mnemonic.split(' '); + for (let i = 0; i < wordsArr.length; i++) { + await page.getByLabel(`${i + 1}`, { exact: true }).fill(wordsArr[i]); + } + await page.getByRole('button', { name: 'Next' }).click(); + await page.getByLabel('New password').fill('123456'); + await page.getByLabel('Confirm password').fill('123456'); + + await page.getByText('Password must be ≥ 8 characters').waitFor(); + await page.getByRole('button', { name: 'Next' }).isDisabled(); + }); + + it('should show error message when the confirm password is do not match', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/walletManager.html`); + + await page.getByRole('button', { name: 'Import a wallet' }).click(); + const wordsArr = testEnv.defaultE2eData.mnemonic.split(' '); + for (let i = 0; i < wordsArr.length; i++) { + await page.getByLabel(`${i + 1}`, { exact: true }).fill(wordsArr[i]); + } + await page.getByRole('button', { name: 'Next' }).click(); + await page.getByLabel('New password').fill(testEnv.defaultE2eData.password); + await page.getByLabel('Confirm password').fill('123456890'); + + await page.getByText('Passwords do not match').waitFor(); + await page.getByRole('button', { name: 'Next' }).isDisabled(); + }); + + it('should show error text when the nick name is too long', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/walletManager.html`); + + await page.getByRole('button', { name: 'Import a wallet' }).click(); + const wordsArr = testEnv.defaultE2eData.mnemonic.split(' '); + for (let i = 0; i < wordsArr.length; i++) { + await page.getByLabel(`${i + 1}`, { exact: true }).fill(wordsArr[i]); + } + await page.getByRole('button', { name: 'Next' }).click(); + + await page.getByLabel('New password').fill(testEnv.defaultE2eData.password); + await page.getByLabel('Confirm password').fill(testEnv.defaultE2eData.password); + await page.getByRole('button', { name: 'Next' }).click(); + + await page.getByLabel('A Descriptive Name For Your Wallet').fill('12345678901234567890'); + + await page.getByText('Username must be ≤ 12 characters').waitFor(); + await page.getByRole('button', { name: 'Next' }).isDisabled(); + }); + + it('should works with defaultE2eData', async () => { + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/walletManager.html`); + + await page.getByRole('button', { name: 'Import a wallet' }).click(); + const wordsArr = testEnv.defaultE2eData.mnemonic.split(' '); + for (let i = 0; i < wordsArr.length; i++) { + await page.getByLabel(`${i + 1}`, { exact: true }).fill(wordsArr[i]); + } + await page.getByRole('button', { name: 'Next' }).click(); + + await page.getByLabel('New password').fill(testEnv.defaultE2eData.password); + await page.getByLabel('Confirm password').fill(testEnv.defaultE2eData.password); + await page.getByRole('button', { name: 'Next' }).click(); + + await page.getByLabel('A Descriptive Name For Your Wallet').fill(testEnv.defaultE2eData.nickname); + await page.getByRole('button', { name: 'Next' }).click(); + await page.getByRole('button', { name: 'All Done' }).click(); + }); +}); diff --git a/e2e/tests/remove-network.test.ts b/e2e/tests/remove-network.test.ts new file mode 100644 index 00000000..4c23ab79 --- /dev/null +++ b/e2e/tests/remove-network.test.ts @@ -0,0 +1,47 @@ +import { DefaultTestEnv } from '../helpers'; + +DefaultTestEnv.setupTest({ initWalletWithDefaults: true }); + +describe('Remove network', function () { + /** + * skip reason: TODO: impl click remove network option + */ + it.skip('should remove successful that network is not in use', async () => { + // add network + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + await page.getByRole('button', { name: 'Network' }).click(); + await page.getByRole('button', { name: 'Add Network' }).click(); + + const addNetworkName = 'name'; + await page.getByLabel('Name').fill(addNetworkName); + await page.getByLabel('URL').fill('https://testnet.ckbapp.dev/'); + await page.getByRole('button', { name: 'Add' }).click(); + await page.getByText(addNetworkName).waitFor(); + + // TODO: add remove network option + }); + + /** + * skip reason: TODO: impl click remove network option + */ + it.skip('should remove successful that network is in use', async () => { + // add network + const page = await testEnv.context.newPage(); + const extensionId = testEnv.extensionId; + await page.goto(`chrome-extension://${extensionId}/popup.html`); + await page.getByRole('button', { name: 'Network' }).click(); + await page.getByRole('button', { name: 'Add Network' }).click(); + + const addNetworkName = 'name'; + await page.getByLabel('Name').fill(addNetworkName); + await page.getByLabel('URL').fill('https://testnet.ckbapp.dev/'); + await page.getByRole('button', { name: 'Add' }).click(); + await page.getByText(addNetworkName).waitFor(); + + // TODO: add remove network option + + // network change main + }); +}); diff --git a/e2e/tests/remove-whitelist-site.test.ts b/e2e/tests/remove-whitelist-site.test.ts new file mode 100644 index 00000000..e6ee198d --- /dev/null +++ b/e2e/tests/remove-whitelist-site.test.ts @@ -0,0 +1,34 @@ +import { DefaultTestEnv } from '../helpers'; + +DefaultTestEnv.setupTest({ initWalletWithDefaults: true }); + +describe(' remove whitelist site', function () { + /** + * skip reason: TODO: impl click remove btn + */ + it.skip('should request failed after site remove', async () => {}); + + /** + * skip reason: Unable to open the plugin wallet on the current page to query the wallet's connection status + */ + it.skip('should Disconnected when site remove', async () => {}); + + /** + * skip reason: TODO: impl click remove btn + */ + it.skip('should pop connect page when send wallet_enable again', async () => { + const enableTask = ckb.request({ method: 'wallet_enable' }); + + const notificationPage = await testEnv.getNotificationPage(); + await notificationPage.getByRole('button', { name: 'Connect' }).click(); + + const res = await enableTask; + expect(res.nickname).toBe(testEnv.defaultE2eData.nickname); + + // should not ask again when already approved + const res2 = await ckb.request({ method: 'wallet_enable' }); + expect(res2.nickname).toBe(testEnv.defaultE2eData.nickname); + + // TODO: remove url + }); +}); diff --git a/e2e/tests/search-whitelist-site.test.ts b/e2e/tests/search-whitelist-site.test.ts new file mode 100644 index 00000000..3cfc6fbd --- /dev/null +++ b/e2e/tests/search-whitelist-site.test.ts @@ -0,0 +1,6 @@ +describe('Search whitelist site', function () { + /** + * TODO: impl click search input + */ + it.todo('should find url when search the site is exist in whitelist'); +}); diff --git a/e2e/tests/wallet-enable.test.ts b/e2e/tests/wallet-enable.test.ts index 4893b486..eebe3ba3 100644 --- a/e2e/tests/wallet-enable.test.ts +++ b/e2e/tests/wallet-enable.test.ts @@ -3,7 +3,7 @@ import { DefaultTestEnv } from '../helpers'; DefaultTestEnv.setupTest({ initWalletWithDefaults: true }); describe('Enable wallet', function () { - test('should get the nickname when approved', async () => { + it('should get the nickname when approved', async () => { const enableTask = ckb.request({ method: 'wallet_enable' }); const notificationPage = await testEnv.getNotificationPage(); @@ -17,7 +17,7 @@ describe('Enable wallet', function () { expect(res2.nickname).toBe(testEnv.defaultE2eData.nickname); }); - test('should throw when user reject approval', async () => { + it('should throw when user reject approval', async () => { const enableTask = ckb.request({ method: 'wallet_enable' }); const notificationPage = await testEnv.getNotificationPage(); @@ -25,4 +25,43 @@ describe('Enable wallet', function () { await expect(enableTask).rejects.toThrowError(/reject/); }); + + /** + * skip: Unable to open the plugin wallet on the current page to query the wallet's connection status + * 1. request wallet_enable + * 2. approved + * expected + * 1. popup.html: connect status => connected + */ + it.todo('should connected after approved'); + + it('should warn when wallet_enable again', async () => { + const enableTask = ckb.request({ method: 'wallet_enable' }); + const notificationPage = await testEnv.getNotificationPage(); + try { + //request wallet_enable again + await ckb.request({ method: 'wallet_enable' }); + } catch (e) { + expect(`${e}`).toMatch(/A request is still in pending./); + + await notificationPage.getByRole('button', { name: 'Connect' }).click(); + const res = await enableTask; + expect(res.nickname).toBe(testEnv.defaultE2eData.nickname); + return; + } + expect('').toBe('failed'); + }); + + /** + * skip reason: Error: [webext-bridge] No handler registered in 'background' to accept messages with id 'rpc' + * + */ + it.skip('should not warn when 2 pages requested wallet', async () => { + void ckb.request({ method: 'wallet_enable' }); + await testEnv.getNotificationPage(); + const page1 = await testEnv.context.newPage(); + await page1.goto(page.url()); + const ckbInPage1 = testEnv.getInjectedCkb(page1); + await ckbInPage1.request({ method: 'wallet_enable' }); + }); });