Repository files navigation

dApp E2E Tests

End-to-end test framework for decentralized application (dApp) interactions using Playwright and Synpress (MetaMask automation).

dApp E2E Tests

Test Coverage

SuiteTestsWhat It Covers
Wallet Connection8Connect, disconnect, reject, network switch, page refresh persistence
Network Switching7Switch networks, reject switch, balance update, wrong network, rapid switching
Token Transfer6Send ETH, reject tx, invalid address, zero amount, insufficient balance, on-chain verification
NFT Mint5Mint, gallery update, reject, on-chain ownership, disabled state
Token Swap6Swap execution, reject, price impact, zero amount, insufficient balance, ERC-20 approval flow

E2E: 32 test cases (+ 2 unit tests for MetaMaskHelper parsing) — 34 total

Architecture (high-level)

flowchart TB
subgraph Automation["Automation"]
PW["Playwright runner"]
Fixtures["Custom fixtures<br/>(dapp + metamask)"]
POM["Page Objects<br/>(DAppPage)"]
MM["MetaMask helper<br/>(Synpress)"]
Chain["ethers.js<br/>(on-chain verification)"]
Env["Env vars / secrets<br/>SEED_PHRASE + WALLET_PASSWORD<br/>DAPP_URL + RPC_URL"]
Env --> PW
Env --> MM
PW --> Fixtures
Fixtures --> POM
Fixtures --> MM
PW --> Chain
end
subgraph Browser["Chromium"]
UI["dApp UI"]
Ext["MetaMask extension"]
end
PW -->|drives| Browser
POM --> UI
MM --> Ext
RPC["RPC endpoint / testnet"]
UI -->|JSON-RPC| RPC
Chain -->|JSON-RPC queries| RPC
PW --> Artifacts["Artifacts<br/>playwright-report/"]
Loading

Repo Layout

dapp-e2e-tests/
├── src/
│ ├── pages/
│ │ ├── BasePage.ts # Base page object with shared methods
│ │ ├── DAppPage.ts # dApp UI interactions (POM pattern)
│ │ └── MetaMaskHelper.ts # MetaMask popup automation + transaction detail extraction
│ ├── fixtures/
│ │ └── dapp.fixture.ts # Custom Playwright fixtures
│ └── utils/
│ └── blockchain.ts # On-chain verification helpers (ethers.js)
├── tests/
│ ├── metamask-helper.spec.ts # MetaMask helper unit tests (transaction detail parsing)
│ ├── wallet-connect.spec.ts # Wallet connection tests
│ ├── network-switch.spec.ts # Network switching tests
│ ├── token-transfer.spec.ts # ETH transfer tests
│ ├── nft-mint.spec.ts # NFT minting tests
│ └── swap.spec.ts # Token swap tests
├── playwright.config.ts # Playwright configuration
└── .github/workflows/e2e.yml # CI pipeline

Design Patterns

  • Page Object Model (POM) — UI interactions encapsulated in reusable page classes
  • Custom Fixtures — Playwright fixtures for DAppPage and MetaMaskHelper injection
  • On-Chain Verification — Tests verify blockchain state using ethers.js, not just UI assertions
  • Separation of Concerns — UI testing, wallet automation, and chain queries are isolated

Tech Stack

ToolPurpose
PlaywrightBrowser automation and test runner
SynpressMetaMask wallet automation
ethers.jsOn-chain state verification
TypeScriptType-safe test code
GitHub ActionsCI/CD pipeline

Setup

# Install dependencies
npm install
# Install Playwright browsers
npx playwright install --with-deps chromium
# Copy environment config
cp .env.example .env
# Edit .env with your test wallet and contract addresses

Run Tests

# Run all tests
npm test# Run tagged suites
npm run test:smoke
npm run test:onchain
# Run with browser visible
npm run test:headed
# Run specific suite
npm run test:wallet
npm run test:transfer
npm run test:nft
npm run test:swap
# View HTML report
npm run report

Tags

  • @smoke: fast sanity checks for CI / PRs
  • @onchain: tests with explicit RPC reads (requires stable RPC_URL and deployed contracts where applicable)
  • @manual: requires a manual precondition (test will skip if not satisfied)

Environment Variables

VariableDescription
DAPP_URLdApp frontend URL
RPC_URLEthereum RPC endpoint (Sepolia)
SEED_PHRASETest wallet seed phrase (never use real funds)
WALLET_PASSWORDMetaMask password for test wallet
CHAIN_IDTarget chain ID (11155111 = Sepolia)
TOKEN_CONTRACTERC-20 token contract address
NFT_CONTRACTERC-721 NFT contract address

CI/CD

On every push / PR to main, GitHub Actions runs lightweight checks that are safe for public CI:

  1. Type Check & Unit Teststsc --noEmit + MetaMask helper unit tests (no secrets required)
  2. Structure Check — Ensures critical framework files exist

The workflow badge reflects these push/PR checks. The full Playwright E2E suite (wallet + on-chain flows) is available via workflow_dispatch once you configure repository secrets SEED_PHRASE and WALLET_PASSWORD, and provide a reachable DAPP_URL.

License

MIT

About

End-to-end test framework for dApp interactions using Playwright, Synpress, and ethers.js — covers wallet connection, token transfer, NFT mint, and token swap with on-chain verification.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

dApp E2E Tests

End-to-end test framework for decentralized application (dApp) interactions using Playwright and Synpress (MetaMask automation).

dApp E2E Tests

Test Coverage

SuiteTestsWhat It Covers
Wallet Connection8Connect, disconnect, reject, network switch, page refresh persistence
Network Switching7Switch networks, reject switch, balance update, wrong network, rapid switching
Token Transfer6Send ETH, reject tx, invalid address, zero amount, insufficient balance, on-chain verification
NFT Mint5Mint, gallery update, reject, on-chain ownership, disabled state
Token Swap6Swap execution, reject, price impact, zero amount, insufficient balance, ERC-20 approval flow

E2E: 32 test cases (+ 2 unit tests for MetaMaskHelper parsing) — 34 total

Architecture (high-level)

flowchart TB
subgraph Automation["Automation"]
PW["Playwright runner"]
Fixtures["Custom fixtures<br/>(dapp + metamask)"]
POM["Page Objects<br/>(DAppPage)"]
MM["MetaMask helper<br/>(Synpress)"]
Chain["ethers.js<br/>(on-chain verification)"]
Env["Env vars / secrets<br/>SEED_PHRASE + WALLET_PASSWORD<br/>DAPP_URL + RPC_URL"]
Env --> PW
Env --> MM
PW --> Fixtures
Fixtures --> POM
Fixtures --> MM
PW --> Chain
end
subgraph Browser["Chromium"]
UI["dApp UI"]
Ext["MetaMask extension"]
end
PW -->|drives| Browser
POM --> UI
MM --> Ext
RPC["RPC endpoint / testnet"]
UI -->|JSON-RPC| RPC
Chain -->|JSON-RPC queries| RPC
PW --> Artifacts["Artifacts<br/>playwright-report/"]
Loading

Repo Layout

dapp-e2e-tests/
├── src/
│ ├── pages/
│ │ ├── BasePage.ts # Base page object with shared methods
│ │ ├── DAppPage.ts # dApp UI interactions (POM pattern)
│ │ └── MetaMaskHelper.ts # MetaMask popup automation + transaction detail extraction
│ ├── fixtures/
│ │ └── dapp.fixture.ts # Custom Playwright fixtures
│ └── utils/
│ └── blockchain.ts # On-chain verification helpers (ethers.js)
├── tests/
│ ├── metamask-helper.spec.ts # MetaMask helper unit tests (transaction detail parsing)
│ ├── wallet-connect.spec.ts # Wallet connection tests
│ ├── network-switch.spec.ts # Network switching tests
│ ├── token-transfer.spec.ts # ETH transfer tests
│ ├── nft-mint.spec.ts # NFT minting tests
│ └── swap.spec.ts # Token swap tests
├── playwright.config.ts # Playwright configuration
└── .github/workflows/e2e.yml # CI pipeline

Design Patterns

  • Page Object Model (POM) — UI interactions encapsulated in reusable page classes
  • Custom Fixtures — Playwright fixtures for DAppPage and MetaMaskHelper injection
  • On-Chain Verification — Tests verify blockchain state using ethers.js, not just UI assertions
  • Separation of Concerns — UI testing, wallet automation, and chain queries are isolated

Tech Stack

ToolPurpose
PlaywrightBrowser automation and test runner
SynpressMetaMask wallet automation
ethers.jsOn-chain state verification
TypeScriptType-safe test code
GitHub ActionsCI/CD pipeline

Setup

# Install dependencies
npm install
# Install Playwright browsers
npx playwright install --with-deps chromium
# Copy environment config
cp .env.example .env
# Edit .env with your test wallet and contract addresses

Run Tests

# Run all tests
npm test# Run tagged suites
npm run test:smoke
npm run test:onchain
# Run with browser visible
npm run test:headed
# Run specific suite
npm run test:wallet
npm run test:transfer
npm run test:nft
npm run test:swap
# View HTML report
npm run report

Tags

  • @smoke: fast sanity checks for CI / PRs
  • @onchain: tests with explicit RPC reads (requires stable RPC_URL and deployed contracts where applicable)
  • @manual: requires a manual precondition (test will skip if not satisfied)

Environment Variables

VariableDescription
DAPP_URLdApp frontend URL
RPC_URLEthereum RPC endpoint (Sepolia)
SEED_PHRASETest wallet seed phrase (never use real funds)
WALLET_PASSWORDMetaMask password for test wallet
CHAIN_IDTarget chain ID (11155111 = Sepolia)
TOKEN_CONTRACTERC-20 token contract address
NFT_CONTRACTERC-721 NFT contract address

CI/CD

On every push / PR to main, GitHub Actions runs lightweight checks that are safe for public CI:

  1. Type Check & Unit Teststsc --noEmit + MetaMask helper unit tests (no secrets required)
  2. Structure Check — Ensures critical framework files exist

The workflow badge reflects these push/PR checks. The full Playwright E2E suite (wallet + on-chain flows) is available via workflow_dispatch once you configure repository secrets SEED_PHRASE and WALLET_PASSWORD, and provide a reachable DAPP_URL.

License

MIT

About

End-to-end test framework for dApp interactions using Playwright, Synpress, and ethers.js — covers wallet connection, token transfer, NFT mint, and token swap with on-chain verification.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

dApp E2E Tests

End-to-end test framework for decentralized application (dApp) interactions using Playwright and Synpress (MetaMask automation).

dApp E2E Tests

Test Coverage

SuiteTestsWhat It Covers
Wallet Connection8Connect, disconnect, reject, network switch, page refresh persistence
Network Switching7Switch networks, reject switch, balance update, wrong network, rapid switching
Token Transfer6Send ETH, reject tx, invalid address, zero amount, insufficient balance, on-chain verification
NFT Mint5Mint, gallery update, reject, on-chain ownership, disabled state
Token Swap6Swap execution, reject, price impact, zero amount, insufficient balance, ERC-20 approval flow

E2E: 32 test cases (+ 2 unit tests for MetaMaskHelper parsing) — 34 total

Architecture (high-level)

flowchart TB
subgraph Automation["Automation"]
PW["Playwright runner"]
Fixtures["Custom fixtures<br/>(dapp + metamask)"]
POM["Page Objects<br/>(DAppPage)"]
MM["MetaMask helper<br/>(Synpress)"]
Chain["ethers.js<br/>(on-chain verification)"]
Env["Env vars / secrets<br/>SEED_PHRASE + WALLET_PASSWORD<br/>DAPP_URL + RPC_URL"]
Env --> PW
Env --> MM
PW --> Fixtures
Fixtures --> POM
Fixtures --> MM
PW --> Chain
end
subgraph Browser["Chromium"]
UI["dApp UI"]
Ext["MetaMask extension"]
end
PW -->|drives| Browser
POM --> UI
MM --> Ext
RPC["RPC endpoint / testnet"]
UI -->|JSON-RPC| RPC
Chain -->|JSON-RPC queries| RPC
PW --> Artifacts["Artifacts<br/>playwright-report/"]
Loading

Repo Layout

dapp-e2e-tests/
├── src/
│ ├── pages/
│ │ ├── BasePage.ts # Base page object with shared methods
│ │ ├── DAppPage.ts # dApp UI interactions (POM pattern)
│ │ └── MetaMaskHelper.ts # MetaMask popup automation + transaction detail extraction
│ ├── fixtures/
│ │ └── dapp.fixture.ts # Custom Playwright fixtures
│ └── utils/
│ └── blockchain.ts # On-chain verification helpers (ethers.js)
├── tests/
│ ├── metamask-helper.spec.ts # MetaMask helper unit tests (transaction detail parsing)
│ ├── wallet-connect.spec.ts # Wallet connection tests
│ ├── network-switch.spec.ts # Network switching tests
│ ├── token-transfer.spec.ts # ETH transfer tests
│ ├── nft-mint.spec.ts # NFT minting tests
│ └── swap.spec.ts # Token swap tests
├── playwright.config.ts # Playwright configuration
└── .github/workflows/e2e.yml # CI pipeline

Design Patterns

  • Page Object Model (POM) — UI interactions encapsulated in reusable page classes
  • Custom Fixtures — Playwright fixtures for DAppPage and MetaMaskHelper injection
  • On-Chain Verification — Tests verify blockchain state using ethers.js, not just UI assertions
  • Separation of Concerns — UI testing, wallet automation, and chain queries are isolated

Tech Stack

ToolPurpose
PlaywrightBrowser automation and test runner
SynpressMetaMask wallet automation
ethers.jsOn-chain state verification
TypeScriptType-safe test code
GitHub ActionsCI/CD pipeline

Setup

# Install dependencies
npm install
# Install Playwright browsers
npx playwright install --with-deps chromium
# Copy environment config
cp .env.example .env
# Edit .env with your test wallet and contract addresses

Run Tests

# Run all tests
npm test# Run tagged suites
npm run test:smoke
npm run test:onchain
# Run with browser visible
npm run test:headed
# Run specific suite
npm run test:wallet
npm run test:transfer
npm run test:nft
npm run test:swap
# View HTML report
npm run report

Tags

  • @smoke: fast sanity checks for CI / PRs
  • @onchain: tests with explicit RPC reads (requires stable RPC_URL and deployed contracts where applicable)
  • @manual: requires a manual precondition (test will skip if not satisfied)

Environment Variables

VariableDescription
DAPP_URLdApp frontend URL
RPC_URLEthereum RPC endpoint (Sepolia)
SEED_PHRASETest wallet seed phrase (never use real funds)
WALLET_PASSWORDMetaMask password for test wallet
CHAIN_IDTarget chain ID (11155111 = Sepolia)
TOKEN_CONTRACTERC-20 token contract address
NFT_CONTRACTERC-721 NFT contract address

CI/CD

On every push / PR to main, GitHub Actions runs lightweight checks that are safe for public CI:

  1. Type Check & Unit Teststsc --noEmit + MetaMask helper unit tests (no secrets required)
  2. Structure Check — Ensures critical framework files exist

The workflow badge reflects these push/PR checks. The full Playwright E2E suite (wallet + on-chain flows) is available via workflow_dispatch once you configure repository secrets SEED_PHRASE and WALLET_PASSWORD, and provide a reachable DAPP_URL.

License

MIT

About

End-to-end test framework for dApp interactions using Playwright, Synpress, and ethers.js — covers wallet connection, token transfer, NFT mint, and token swap with on-chain verification.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

dApp E2E Tests

End-to-end test framework for decentralized application (dApp) interactions using Playwright and Synpress (MetaMask automation).

dApp E2E Tests

Test Coverage

SuiteTestsWhat It Covers
Wallet Connection8Connect, disconnect, reject, network switch, page refresh persistence
Network Switching7Switch networks, reject switch, balance update, wrong network, rapid switching
Token Transfer6Send ETH, reject tx, invalid address, zero amount, insufficient balance, on-chain verification
NFT Mint5Mint, gallery update, reject, on-chain ownership, disabled state
Token Swap6Swap execution, reject, price impact, zero amount, insufficient balance, ERC-20 approval flow

E2E: 32 test cases (+ 2 unit tests for MetaMaskHelper parsing) — 34 total

Architecture (high-level)

flowchart TB
subgraph Automation["Automation"]
PW["Playwright runner"]
Fixtures["Custom fixtures<br/>(dapp + metamask)"]
POM["Page Objects<br/>(DAppPage)"]
MM["MetaMask helper<br/>(Synpress)"]
Chain["ethers.js<br/>(on-chain verification)"]
Env["Env vars / secrets<br/>SEED_PHRASE + WALLET_PASSWORD<br/>DAPP_URL + RPC_URL"]
Env --> PW
Env --> MM
PW --> Fixtures
Fixtures --> POM
Fixtures --> MM
PW --> Chain
end
subgraph Browser["Chromium"]
UI["dApp UI"]
Ext["MetaMask extension"]
end
PW -->|drives| Browser
POM --> UI
MM --> Ext
RPC["RPC endpoint / testnet"]
UI -->|JSON-RPC| RPC
Chain -->|JSON-RPC queries| RPC
PW --> Artifacts["Artifacts<br/>playwright-report/"]
Loading

Repo Layout

dapp-e2e-tests/
├── src/
│ ├── pages/
│ │ ├── BasePage.ts # Base page object with shared methods
│ │ ├── DAppPage.ts # dApp UI interactions (POM pattern)
│ │ └── MetaMaskHelper.ts # MetaMask popup automation + transaction detail extraction
│ ├── fixtures/
│ │ └── dapp.fixture.ts # Custom Playwright fixtures
│ └── utils/
│ └── blockchain.ts # On-chain verification helpers (ethers.js)
├── tests/
│ ├── metamask-helper.spec.ts # MetaMask helper unit tests (transaction detail parsing)
│ ├── wallet-connect.spec.ts # Wallet connection tests
│ ├── network-switch.spec.ts # Network switching tests
│ ├── token-transfer.spec.ts # ETH transfer tests
│ ├── nft-mint.spec.ts # NFT minting tests
│ └── swap.spec.ts # Token swap tests
├── playwright.config.ts # Playwright configuration
└── .github/workflows/e2e.yml # CI pipeline

Design Patterns

  • Page Object Model (POM) — UI interactions encapsulated in reusable page classes
  • Custom Fixtures — Playwright fixtures for DAppPage and MetaMaskHelper injection
  • On-Chain Verification — Tests verify blockchain state using ethers.js, not just UI assertions
  • Separation of Concerns — UI testing, wallet automation, and chain queries are isolated

Tech Stack

ToolPurpose
PlaywrightBrowser automation and test runner
SynpressMetaMask wallet automation
ethers.jsOn-chain state verification
TypeScriptType-safe test code
GitHub ActionsCI/CD pipeline

Setup

# Install dependencies
npm install
# Install Playwright browsers
npx playwright install --with-deps chromium
# Copy environment config
cp .env.example .env
# Edit .env with your test wallet and contract addresses

Run Tests

# Run all tests
npm test# Run tagged suites
npm run test:smoke
npm run test:onchain
# Run with browser visible
npm run test:headed
# Run specific suite
npm run test:wallet
npm run test:transfer
npm run test:nft
npm run test:swap
# View HTML report
npm run report

Tags

  • @smoke: fast sanity checks for CI / PRs
  • @onchain: tests with explicit RPC reads (requires stable RPC_URL and deployed contracts where applicable)
  • @manual: requires a manual precondition (test will skip if not satisfied)

Environment Variables

VariableDescription
DAPP_URLdApp frontend URL
RPC_URLEthereum RPC endpoint (Sepolia)
SEED_PHRASETest wallet seed phrase (never use real funds)
WALLET_PASSWORDMetaMask password for test wallet
CHAIN_IDTarget chain ID (11155111 = Sepolia)
TOKEN_CONTRACTERC-20 token contract address
NFT_CONTRACTERC-721 NFT contract address

CI/CD

On every push / PR to main, GitHub Actions runs lightweight checks that are safe for public CI:

  1. Type Check & Unit Teststsc --noEmit + MetaMask helper unit tests (no secrets required)
  2. Structure Check — Ensures critical framework files exist

The workflow badge reflects these push/PR checks. The full Playwright E2E suite (wallet + on-chain flows) is available via workflow_dispatch once you configure repository secrets SEED_PHRASE and WALLET_PASSWORD, and provide a reachable DAPP_URL.

License

MIT

About

End-to-end test framework for dApp interactions using Playwright, Synpress, and ethers.js — covers wallet connection, token transfer, NFT mint, and token swap with on-chain verification.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

dApp E2E Tests

End-to-end test framework for decentralized application (dApp) interactions using Playwright and Synpress (MetaMask automation).

dApp E2E Tests

Test Coverage

SuiteTestsWhat It Covers
Wallet Connection8Connect, disconnect, reject, network switch, page refresh persistence
Network Switching7Switch networks, reject switch, balance update, wrong network, rapid switching
Token Transfer6Send ETH, reject tx, invalid address, zero amount, insufficient balance, on-chain verification
NFT Mint5Mint, gallery update, reject, on-chain ownership, disabled state
Token Swap6Swap execution, reject, price impact, zero amount, insufficient balance, ERC-20 approval flow

E2E: 32 test cases (+ 2 unit tests for MetaMaskHelper parsing) — 34 total

Architecture (high-level)

flowchart TB
subgraph Automation["Automation"]
PW["Playwright runner"]
Fixtures["Custom fixtures<br/>(dapp + metamask)"]
POM["Page Objects<br/>(DAppPage)"]
MM["MetaMask helper<br/>(Synpress)"]
Chain["ethers.js<br/>(on-chain verification)"]
Env["Env vars / secrets<br/>SEED_PHRASE + WALLET_PASSWORD<br/>DAPP_URL + RPC_URL"]
Env --> PW
Env --> MM
PW --> Fixtures
Fixtures --> POM
Fixtures --> MM
PW --> Chain
end
subgraph Browser["Chromium"]
UI["dApp UI"]
Ext["MetaMask extension"]
end
PW -->|drives| Browser
POM --> UI
MM --> Ext
RPC["RPC endpoint / testnet"]
UI -->|JSON-RPC| RPC
Chain -->|JSON-RPC queries| RPC
PW --> Artifacts["Artifacts<br/>playwright-report/"]
Loading

Repo Layout

dapp-e2e-tests/
├── src/
│ ├── pages/
│ │ ├── BasePage.ts # Base page object with shared methods
│ │ ├── DAppPage.ts # dApp UI interactions (POM pattern)
│ │ └── MetaMaskHelper.ts # MetaMask popup automation + transaction detail extraction
│ ├── fixtures/
│ │ └── dapp.fixture.ts # Custom Playwright fixtures
│ └── utils/
│ └── blockchain.ts # On-chain verification helpers (ethers.js)
├── tests/
│ ├── metamask-helper.spec.ts # MetaMask helper unit tests (transaction detail parsing)
│ ├── wallet-connect.spec.ts # Wallet connection tests
│ ├── network-switch.spec.ts # Network switching tests
│ ├── token-transfer.spec.ts # ETH transfer tests
│ ├── nft-mint.spec.ts # NFT minting tests
│ └── swap.spec.ts # Token swap tests
├── playwright.config.ts # Playwright configuration
└── .github/workflows/e2e.yml # CI pipeline

Design Patterns

  • Page Object Model (POM) — UI interactions encapsulated in reusable page classes
  • Custom Fixtures — Playwright fixtures for DAppPage and MetaMaskHelper injection
  • On-Chain Verification — Tests verify blockchain state using ethers.js, not just UI assertions
  • Separation of Concerns — UI testing, wallet automation, and chain queries are isolated

Tech Stack

ToolPurpose
PlaywrightBrowser automation and test runner
SynpressMetaMask wallet automation
ethers.jsOn-chain state verification
TypeScriptType-safe test code
GitHub ActionsCI/CD pipeline

Setup

# Install dependencies
npm install
# Install Playwright browsers
npx playwright install --with-deps chromium
# Copy environment config
cp .env.example .env
# Edit .env with your test wallet and contract addresses

Run Tests

# Run all tests
npm test# Run tagged suites
npm run test:smoke
npm run test:onchain
# Run with browser visible
npm run test:headed
# Run specific suite
npm run test:wallet
npm run test:transfer
npm run test:nft
npm run test:swap
# View HTML report
npm run report

Tags

  • @smoke: fast sanity checks for CI / PRs
  • @onchain: tests with explicit RPC reads (requires stable RPC_URL and deployed contracts where applicable)
  • @manual: requires a manual precondition (test will skip if not satisfied)

Environment Variables

VariableDescription
DAPP_URLdApp frontend URL
RPC_URLEthereum RPC endpoint (Sepolia)
SEED_PHRASETest wallet seed phrase (never use real funds)
WALLET_PASSWORDMetaMask password for test wallet
CHAIN_IDTarget chain ID (11155111 = Sepolia)
TOKEN_CONTRACTERC-20 token contract address
NFT_CONTRACTERC-721 NFT contract address

CI/CD

On every push / PR to main, GitHub Actions runs lightweight checks that are safe for public CI:

  1. Type Check & Unit Teststsc --noEmit + MetaMask helper unit tests (no secrets required)
  2. Structure Check — Ensures critical framework files exist

The workflow badge reflects these push/PR checks. The full Playwright E2E suite (wallet + on-chain flows) is available via workflow_dispatch once you configure repository secrets SEED_PHRASE and WALLET_PASSWORD, and provide a reachable DAPP_URL.

License

MIT

About

End-to-end test framework for dApp interactions using Playwright, Synpress, and ethers.js — covers wallet connection, token transfer, NFT mint, and token swap with on-chain verification.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

dApp E2E Tests

End-to-end test framework for decentralized application (dApp) interactions using Playwright and Synpress (MetaMask automation).

dApp E2E Tests

Test Coverage

SuiteTestsWhat It Covers
Wallet Connection8Connect, disconnect, reject, network switch, page refresh persistence
Network Switching7Switch networks, reject switch, balance update, wrong network, rapid switching
Token Transfer6Send ETH, reject tx, invalid address, zero amount, insufficient balance, on-chain verification
NFT Mint5Mint, gallery update, reject, on-chain ownership, disabled state
Token Swap6Swap execution, reject, price impact, zero amount, insufficient balance, ERC-20 approval flow

E2E: 32 test cases (+ 2 unit tests for MetaMaskHelper parsing) — 34 total

Architecture (high-level)

flowchart TB
subgraph Automation["Automation"]
PW["Playwright runner"]
Fixtures["Custom fixtures<br/>(dapp + metamask)"]
POM["Page Objects<br/>(DAppPage)"]
MM["MetaMask helper<br/>(Synpress)"]
Chain["ethers.js<br/>(on-chain verification)"]
Env["Env vars / secrets<br/>SEED_PHRASE + WALLET_PASSWORD<br/>DAPP_URL + RPC_URL"]
Env --> PW
Env --> MM
PW --> Fixtures
Fixtures --> POM
Fixtures --> MM
PW --> Chain
end
subgraph Browser["Chromium"]
UI["dApp UI"]
Ext["MetaMask extension"]
end
PW -->|drives| Browser
POM --> UI
MM --> Ext
RPC["RPC endpoint / testnet"]
UI -->|JSON-RPC| RPC
Chain -->|JSON-RPC queries| RPC
PW --> Artifacts["Artifacts<br/>playwright-report/"]
Loading

Repo Layout

dapp-e2e-tests/
├── src/
│ ├── pages/
│ │ ├── BasePage.ts # Base page object with shared methods
│ │ ├── DAppPage.ts # dApp UI interactions (POM pattern)
│ │ └── MetaMaskHelper.ts # MetaMask popup automation + transaction detail extraction
│ ├── fixtures/
│ │ └── dapp.fixture.ts # Custom Playwright fixtures
│ └── utils/
│ └── blockchain.ts # On-chain verification helpers (ethers.js)
├── tests/
│ ├── metamask-helper.spec.ts # MetaMask helper unit tests (transaction detail parsing)
│ ├── wallet-connect.spec.ts # Wallet connection tests
│ ├── network-switch.spec.ts # Network switching tests
│ ├── token-transfer.spec.ts # ETH transfer tests
│ ├── nft-mint.spec.ts # NFT minting tests
│ └── swap.spec.ts # Token swap tests
├── playwright.config.ts # Playwright configuration
└── .github/workflows/e2e.yml # CI pipeline

Design Patterns

  • Page Object Model (POM) — UI interactions encapsulated in reusable page classes
  • Custom Fixtures — Playwright fixtures for DAppPage and MetaMaskHelper injection
  • On-Chain Verification — Tests verify blockchain state using ethers.js, not just UI assertions
  • Separation of Concerns — UI testing, wallet automation, and chain queries are isolated

Tech Stack

ToolPurpose
PlaywrightBrowser automation and test runner
SynpressMetaMask wallet automation
ethers.jsOn-chain state verification
TypeScriptType-safe test code
GitHub ActionsCI/CD pipeline

Setup

# Install dependencies
npm install
# Install Playwright browsers
npx playwright install --with-deps chromium
# Copy environment config
cp .env.example .env
# Edit .env with your test wallet and contract addresses

Run Tests

# Run all tests
npm test# Run tagged suites
npm run test:smoke
npm run test:onchain
# Run with browser visible
npm run test:headed
# Run specific suite
npm run test:wallet
npm run test:transfer
npm run test:nft
npm run test:swap
# View HTML report
npm run report

Tags

  • @smoke: fast sanity checks for CI / PRs
  • @onchain: tests with explicit RPC reads (requires stable RPC_URL and deployed contracts where applicable)
  • @manual: requires a manual precondition (test will skip if not satisfied)

Environment Variables

VariableDescription
DAPP_URLdApp frontend URL
RPC_URLEthereum RPC endpoint (Sepolia)
SEED_PHRASETest wallet seed phrase (never use real funds)
WALLET_PASSWORDMetaMask password for test wallet
CHAIN_IDTarget chain ID (11155111 = Sepolia)
TOKEN_CONTRACTERC-20 token contract address
NFT_CONTRACTERC-721 NFT contract address

CI/CD

On every push / PR to main, GitHub Actions runs lightweight checks that are safe for public CI:

  1. Type Check & Unit Teststsc --noEmit + MetaMask helper unit tests (no secrets required)
  2. Structure Check — Ensures critical framework files exist

The workflow badge reflects these push/PR checks. The full Playwright E2E suite (wallet + on-chain flows) is available via workflow_dispatch once you configure repository secrets SEED_PHRASE and WALLET_PASSWORD, and provide a reachable DAPP_URL.

License

MIT

About

End-to-end test framework for dApp interactions using Playwright, Synpress, and ethers.js — covers wallet connection, token transfer, NFT mint, and token swap with on-chain verification.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

dApp E2E Tests

End-to-end test framework for decentralized application (dApp) interactions using Playwright and Synpress (MetaMask automation).

dApp E2E Tests

Test Coverage

SuiteTestsWhat It Covers
Wallet Connection8Connect, disconnect, reject, network switch, page refresh persistence
Network Switching7Switch networks, reject switch, balance update, wrong network, rapid switching
Token Transfer6Send ETH, reject tx, invalid address, zero amount, insufficient balance, on-chain verification
NFT Mint5Mint, gallery update, reject, on-chain ownership, disabled state
Token Swap6Swap execution, reject, price impact, zero amount, insufficient balance, ERC-20 approval flow

E2E: 32 test cases (+ 2 unit tests for MetaMaskHelper parsing) — 34 total

Architecture (high-level)

flowchart TB
subgraph Automation["Automation"]
PW["Playwright runner"]
Fixtures["Custom fixtures<br/>(dapp + metamask)"]
POM["Page Objects<br/>(DAppPage)"]
MM["MetaMask helper<br/>(Synpress)"]
Chain["ethers.js<br/>(on-chain verification)"]
Env["Env vars / secrets<br/>SEED_PHRASE + WALLET_PASSWORD<br/>DAPP_URL + RPC_URL"]
Env --> PW
Env --> MM
PW --> Fixtures
Fixtures --> POM
Fixtures --> MM
PW --> Chain
end
subgraph Browser["Chromium"]
UI["dApp UI"]
Ext["MetaMask extension"]
end
PW -->|drives| Browser
POM --> UI
MM --> Ext
RPC["RPC endpoint / testnet"]
UI -->|JSON-RPC| RPC
Chain -->|JSON-RPC queries| RPC
PW --> Artifacts["Artifacts<br/>playwright-report/"]
Loading

Repo Layout

dapp-e2e-tests/
├── src/
│ ├── pages/
│ │ ├── BasePage.ts # Base page object with shared methods
│ │ ├── DAppPage.ts # dApp UI interactions (POM pattern)
│ │ └── MetaMaskHelper.ts # MetaMask popup automation + transaction detail extraction
│ ├── fixtures/
│ │ └── dapp.fixture.ts # Custom Playwright fixtures
│ └── utils/
│ └── blockchain.ts # On-chain verification helpers (ethers.js)
├── tests/
│ ├── metamask-helper.spec.ts # MetaMask helper unit tests (transaction detail parsing)
│ ├── wallet-connect.spec.ts # Wallet connection tests
│ ├── network-switch.spec.ts # Network switching tests
│ ├── token-transfer.spec.ts # ETH transfer tests
│ ├── nft-mint.spec.ts # NFT minting tests
│ └── swap.spec.ts # Token swap tests
├── playwright.config.ts # Playwright configuration
└── .github/workflows/e2e.yml # CI pipeline

Design Patterns

  • Page Object Model (POM) — UI interactions encapsulated in reusable page classes
  • Custom Fixtures — Playwright fixtures for DAppPage and MetaMaskHelper injection
  • On-Chain Verification — Tests verify blockchain state using ethers.js, not just UI assertions
  • Separation of Concerns — UI testing, wallet automation, and chain queries are isolated

Tech Stack

ToolPurpose
PlaywrightBrowser automation and test runner
SynpressMetaMask wallet automation
ethers.jsOn-chain state verification
TypeScriptType-safe test code
GitHub ActionsCI/CD pipeline

Setup

# Install dependencies
npm install
# Install Playwright browsers
npx playwright install --with-deps chromium
# Copy environment config
cp .env.example .env
# Edit .env with your test wallet and contract addresses

Run Tests

# Run all tests
npm test# Run tagged suites
npm run test:smoke
npm run test:onchain
# Run with browser visible
npm run test:headed
# Run specific suite
npm run test:wallet
npm run test:transfer
npm run test:nft
npm run test:swap
# View HTML report
npm run report

Tags

  • @smoke: fast sanity checks for CI / PRs
  • @onchain: tests with explicit RPC reads (requires stable RPC_URL and deployed contracts where applicable)
  • @manual: requires a manual precondition (test will skip if not satisfied)

Environment Variables

VariableDescription
DAPP_URLdApp frontend URL
RPC_URLEthereum RPC endpoint (Sepolia)
SEED_PHRASETest wallet seed phrase (never use real funds)
WALLET_PASSWORDMetaMask password for test wallet
CHAIN_IDTarget chain ID (11155111 = Sepolia)
TOKEN_CONTRACTERC-20 token contract address
NFT_CONTRACTERC-721 NFT contract address

CI/CD

On every push / PR to main, GitHub Actions runs lightweight checks that are safe for public CI:

  1. Type Check & Unit Teststsc --noEmit + MetaMask helper unit tests (no secrets required)
  2. Structure Check — Ensures critical framework files exist

The workflow badge reflects these push/PR checks. The full Playwright E2E suite (wallet + on-chain flows) is available via workflow_dispatch once you configure repository secrets SEED_PHRASE and WALLET_PASSWORD, and provide a reachable DAPP_URL.

License

MIT

About

End-to-end test framework for dApp interactions using Playwright, Synpress, and ethers.js — covers wallet connection, token transfer, NFT mint, and token swap with on-chain verification.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

dApp E2E Tests

End-to-end test framework for decentralized application (dApp) interactions using Playwright and Synpress (MetaMask automation).

dApp E2E Tests

Test Coverage

SuiteTestsWhat It Covers
Wallet Connection8Connect, disconnect, reject, network switch, page refresh persistence
Network Switching7Switch networks, reject switch, balance update, wrong network, rapid switching
Token Transfer6Send ETH, reject tx, invalid address, zero amount, insufficient balance, on-chain verification
NFT Mint5Mint, gallery update, reject, on-chain ownership, disabled state
Token Swap6Swap execution, reject, price impact, zero amount, insufficient balance, ERC-20 approval flow

E2E: 32 test cases (+ 2 unit tests for MetaMaskHelper parsing) — 34 total

Architecture (high-level)

flowchart TB
subgraph Automation["Automation"]
PW["Playwright runner"]
Fixtures["Custom fixtures<br/>(dapp + metamask)"]
POM["Page Objects<br/>(DAppPage)"]
MM["MetaMask helper<br/>(Synpress)"]
Chain["ethers.js<br/>(on-chain verification)"]
Env["Env vars / secrets<br/>SEED_PHRASE + WALLET_PASSWORD<br/>DAPP_URL + RPC_URL"]
Env --> PW
Env --> MM
PW --> Fixtures
Fixtures --> POM
Fixtures --> MM
PW --> Chain
end
subgraph Browser["Chromium"]
UI["dApp UI"]
Ext["MetaMask extension"]
end
PW -->|drives| Browser
POM --> UI
MM --> Ext
RPC["RPC endpoint / testnet"]
UI -->|JSON-RPC| RPC
Chain -->|JSON-RPC queries| RPC
PW --> Artifacts["Artifacts<br/>playwright-report/"]
Loading

Repo Layout

dapp-e2e-tests/
├── src/
│ ├── pages/
│ │ ├── BasePage.ts # Base page object with shared methods
│ │ ├── DAppPage.ts # dApp UI interactions (POM pattern)
│ │ └── MetaMaskHelper.ts # MetaMask popup automation + transaction detail extraction
│ ├── fixtures/
│ │ └── dapp.fixture.ts # Custom Playwright fixtures
│ └── utils/
│ └── blockchain.ts # On-chain verification helpers (ethers.js)
├── tests/
│ ├── metamask-helper.spec.ts # MetaMask helper unit tests (transaction detail parsing)
│ ├── wallet-connect.spec.ts # Wallet connection tests
│ ├── network-switch.spec.ts # Network switching tests
│ ├── token-transfer.spec.ts # ETH transfer tests
│ ├── nft-mint.spec.ts # NFT minting tests
│ └── swap.spec.ts # Token swap tests
├── playwright.config.ts # Playwright configuration
└── .github/workflows/e2e.yml # CI pipeline

Design Patterns

  • Page Object Model (POM) — UI interactions encapsulated in reusable page classes
  • Custom Fixtures — Playwright fixtures for DAppPage and MetaMaskHelper injection
  • On-Chain Verification — Tests verify blockchain state using ethers.js, not just UI assertions
  • Separation of Concerns — UI testing, wallet automation, and chain queries are isolated

Tech Stack

ToolPurpose
PlaywrightBrowser automation and test runner
SynpressMetaMask wallet automation
ethers.jsOn-chain state verification
TypeScriptType-safe test code
GitHub ActionsCI/CD pipeline

Setup

# Install dependencies
npm install
# Install Playwright browsers
npx playwright install --with-deps chromium
# Copy environment config
cp .env.example .env
# Edit .env with your test wallet and contract addresses

Run Tests

# Run all tests
npm test# Run tagged suites
npm run test:smoke
npm run test:onchain
# Run with browser visible
npm run test:headed
# Run specific suite
npm run test:wallet
npm run test:transfer
npm run test:nft
npm run test:swap
# View HTML report
npm run report

Tags

  • @smoke: fast sanity checks for CI / PRs
  • @onchain: tests with explicit RPC reads (requires stable RPC_URL and deployed contracts where applicable)
  • @manual: requires a manual precondition (test will skip if not satisfied)

Environment Variables

VariableDescription
DAPP_URLdApp frontend URL
RPC_URLEthereum RPC endpoint (Sepolia)
SEED_PHRASETest wallet seed phrase (never use real funds)
WALLET_PASSWORDMetaMask password for test wallet
CHAIN_IDTarget chain ID (11155111 = Sepolia)
TOKEN_CONTRACTERC-20 token contract address
NFT_CONTRACTERC-721 NFT contract address

CI/CD

On every push / PR to main, GitHub Actions runs lightweight checks that are safe for public CI:

  1. Type Check & Unit Teststsc --noEmit + MetaMask helper unit tests (no secrets required)
  2. Structure Check — Ensures critical framework files exist

The workflow badge reflects these push/PR checks. The full Playwright E2E suite (wallet + on-chain flows) is available via workflow_dispatch once you configure repository secrets SEED_PHRASE and WALLET_PASSWORD, and provide a reachable DAPP_URL.

License

MIT

About

End-to-end test framework for dApp interactions using Playwright, Synpress, and ethers.js — covers wallet connection, token transfer, NFT mint, and token swap with on-chain verification.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages