Тестирование dapps с synpress
19 июня 2023 г.
Для тестирования функций связанных с metamask, я использую synpress. Он создан на базе cypress и в работе практически ничем не отличается.
Документация https://github.com/Synthetixio/synpress
Необходимо установить cypress
npm install cypress --save-dev
и synpress
npm install --save-dev @synthetixio/synpress
Для работы необходим будет приватный ключ synpress.
Скрипты в package.json
1"scripts": {2 <...>3 "synpress": "synpress run --configFile=synpress.config.js",4}5
Запуск командой npm run synpress
Основные команды с их описанием https://github.com/Synthetixio/synpress/blob/dev/tests/e2e/specs/metamask-spec.js
Далее непоследовательно отмечу некоторые команды, которые мне пригодились в работе:
Проверка смены сети (в примере, на goerly)
1cy.changeMetamaskNetwork('goerli').then(networkChanged => {2 expect(networkChanged).to.be.true;3});4
Подтверждение
1cy.acceptMetamaskAccess().should("be.true");
Добавление сети
1cy.addMetamaskNetwork({2 networkName: 'Polygon',3 rpcUrl: 'https://polygon-rpc.com',4 chainId: '137',5 symbol: 'MATIC',6 blockExplorer: 'https://polygonscan.com',7 isTestnet: false,8 }).then(networkAdded => {9 expect(networkAdded).to.be.true;10 });11
Переключение аккаунтов и проверка, что коннект произошел
1cy.switchMetamaskAccount(1).then(accountChanged => {2 expect(accountChanged).to.be.true;3}).then(connected => {4 expect(connected).to.be.true;5});
Получение адреса и дальнейшие действия с ним
1cy.getMetamaskWalletAddress().then(address => {2 let cut_address = address.toString().substring(0, 4) + '...' + address.toString().substr(address.length - 4);3 cy.get('.user_address').should('have.text', cut_address.toLowerCase());4});5
Дисконнект
1cy.disconnectMetamaskWalletFromDapp().then(disconnected => {2 expect(disconnected).to.be.true;3});4
Подтверждение транзакции
1cy.confirmMetamaskTransaction().then(confirmed => {2 expect(confirmed).to.be.true;3});4
Отклонить транзакцию
1cy.rejectMetamaskTransaction().then(rejected => {2 expect(rejected).to.be.true;3});4
Переключится на уведомление метамаска
1cy.switchToMetamaskNotification();
Добавить и изменить сеть
1cy.allowMetamaskToAddAndSwitchNetwork('close').then(approved => {2 expect(approved).to.be.true;3 });4
Файл synpress.config.js
1const setupNodeEvents = require("@synthetixio/synpress/plugins/index");2const { defineConfig } = require('cypress');34const supportFile = 'tests/e2e/support.js';56module.exports = defineConfig({7 userAgent: "synpress",8 retries: {9 runMode: 0,10 openMode: 011 },12 fixturesFolder: "tests/e2e/fixtures",13 screenshotsFolder: "tests/e2e/screenshots",14 videosFolder: "tests/e2e/videos",15 video: false,16 chromeWebSecurity: true,17 viewportWidth: 1366,18 viewportHeight: 850,19 e2e: {20 setupNodeEvents,21 baseUrl: "http://localhost:8080",22 specPattern: 'tests/e2e/specs/**/*.{js,jsx,ts,tsx}',23 supportFile,24 },25 component: {26 setupNodeEvents,27 specPattern: './**/*cy.{js,jsx,ts,tsx}',28 supportFile,29 },30 env: {31 coverage: false32 },33 defaultCommandTimeout: 30000,34 pageLoadTimeout: 30000,35 requestTimeout: 3000036});37
Файл support.js
1import "@testing-library/cypress/add-commands";2import "@synthetixio/synpress/support";3