Merge pull request 'fix: E2E test files use file-level eslint-disable for no-restricted-syntax, suppressing all future rules in that group (#451)' (#473) from fix/issue-451 into master

This commit is contained in:
johba 2026-03-06 02:44:16 +01:00
commit 61f9e07e60
12 changed files with 163 additions and 12 deletions

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles. */
import { expect, test, type APIRequestContext } from '@playwright/test';
import { Wallet } from 'ethers';
import { createWalletContext } from '../setup/wallet-provider';
@ -82,9 +81,11 @@ test.describe('Acquire & Stake', () => {
await page.evaluate(() => {
window.dispatchEvent(new Event('resize'));
});
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
// Give extra time for wallet connectors to initialize
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Connect wallet flow:
@ -122,6 +123,7 @@ test.describe('Acquire & Stake', () => {
}
if (panelOpened) {
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
// Look for the injected wallet connector in the slideout panel
@ -130,6 +132,7 @@ test.describe('Acquire & Stake', () => {
if (await injectedConnector.isVisible({ timeout: 5_000 })) {
console.log('[TEST] Clicking first wallet connector...');
await injectedConnector.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
} else {
console.log('[TEST] WARNING: No wallet connector found in panel');
@ -163,6 +166,7 @@ test.describe('Acquire & Stake', () => {
const mintButton = page.getByRole('button', { name: 'Mint' });
await expect(mintButton).toBeEnabled();
await mintButton.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
console.log('[TEST] Navigating to get-krk page to buy KRK...');
@ -190,6 +194,7 @@ test.describe('Acquire & Stake', () => {
} catch (e) {
console.log('[TEST] No "Submitting" state detected, swap may have completed instantly');
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
console.log('[TEST] Verifying swap via RPC...');
@ -218,6 +223,7 @@ test.describe('Acquire & Stake', () => {
// Now test staking via UI
console.log('[TEST] Navigating to stake page...');
await navigateSPA(page, '/app/stake');
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Wait for the stake form to be initialized
@ -263,6 +269,7 @@ test.describe('Acquire & Stake', () => {
console.log('[TEST] Polling GraphQL for staking position (Ponder indexing latency)...');
let positions: Awaited<ReturnType<typeof fetchPositions>> = [];
for (let attempt = 0; attempt < 15; attempt++) {
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
positions = await fetchPositions(request, ACCOUNT_ADDRESS);
if (positions.length > 0) break;

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles. */
import { expect, test, type APIRequestContext } from '@playwright/test';
import { Wallet } from 'ethers';
import { createWalletContext } from '../setup/wallet-provider';
@ -103,9 +102,11 @@ test.describe('Max Stake All Tax Rates', () => {
await page.evaluate(() => {
window.dispatchEvent(new Event('resize'));
});
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
// Give extra time for wallet connectors to initialize
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Connect wallet flow:
@ -143,6 +144,7 @@ test.describe('Max Stake All Tax Rates', () => {
}
if (panelOpened) {
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
// Look for the injected wallet connector in the slideout panel
@ -151,6 +153,7 @@ test.describe('Max Stake All Tax Rates', () => {
if (await injectedConnector.isVisible({ timeout: 5_000 })) {
console.log('[TEST] Clicking first wallet connector...');
await injectedConnector.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
} else {
console.log('[TEST] WARNING: No wallet connector found in panel');
@ -174,6 +177,7 @@ test.describe('Max Stake All Tax Rates', () => {
const mintButton = page.getByRole('button', { name: 'Mint' });
await expect(mintButton).toBeEnabled();
await mintButton.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// Step 2: Buy a large amount of KRK tokens via the get-krk page
@ -199,6 +203,7 @@ test.describe('Max Stake All Tax Rates', () => {
} catch (e) {
console.log('[TEST] Swap may have completed instantly');
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Verify we have KRK tokens
@ -225,6 +230,7 @@ test.describe('Max Stake All Tax Rates', () => {
// Step 3: Navigate to stake page
console.log('[TEST] Navigating to stake page...');
await navigateSPA(page, '/app/stake');
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
const tokenAmountSlider = page.getByRole('slider', { name: 'Token Amount' });
@ -282,6 +288,7 @@ test.describe('Max Stake All Tax Rates', () => {
}
positionCount++;
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for Ponder indexing lag and UI re-renders after on-chain transactions in E2E tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
}

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout/Promise+setTimeout: no event source exists for Ponder indexing lag and UI re-renders; Promise+setTimeout is used for polling Ponder over HTTP where no push subscription is available. See AGENTS.md #Engineering Principles. */
import { test, expect, type APIRequestContext } from '@playwright/test';
import { Wallet } from 'ethers';
import { createWalletContext } from '../setup/wallet-provider';
@ -61,6 +60,7 @@ test.describe('Dashboard Pages', () => {
console.log(`[TEST] Ponder has ${positions.length} positions after ${Date.now() - start}ms`);
break;
}
// eslint-disable-next-line no-restricted-syntax -- no event source exists for Ponder indexing lag and UI re-renders; Promise+setTimeout used for polling Ponder over HTTP where no push subscription is available. See AGENTS.md #Engineering Principles.
await new Promise(r => setTimeout(r, pollMs));
}
if (!found) {
@ -85,6 +85,7 @@ test.describe('Dashboard Pages', () => {
waitUntil: 'domcontentloaded',
});
await page.waitForLoadState('networkidle');
// eslint-disable-next-line no-restricted-syntax -- no event source exists for Ponder indexing lag and UI re-renders; Promise+setTimeout used for polling Ponder over HTTP where no push subscription is available. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2000);
// Should show the address (truncated)
@ -148,6 +149,7 @@ test.describe('Dashboard Pages', () => {
waitUntil: 'domcontentloaded',
});
await page.waitForLoadState('networkidle');
// eslint-disable-next-line no-restricted-syntax -- no event source exists for Ponder indexing lag and UI re-renders; Promise+setTimeout used for polling Ponder over HTTP where no push subscription is available. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2000);
// Should show position entries with links to position detail
@ -179,6 +181,7 @@ test.describe('Dashboard Pages', () => {
waitUntil: 'domcontentloaded',
});
await page.waitForLoadState('networkidle');
// eslint-disable-next-line no-restricted-syntax -- no event source exists for Ponder indexing lag and UI re-renders; Promise+setTimeout used for polling Ponder over HTTP where no push subscription is available. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2000);
// Page should render without crashing
@ -229,6 +232,7 @@ test.describe('Dashboard Pages', () => {
waitUntil: 'domcontentloaded',
});
await page.waitForLoadState('networkidle');
// eslint-disable-next-line no-restricted-syntax -- no event source exists for Ponder indexing lag and UI re-renders; Promise+setTimeout used for polling Ponder over HTTP where no push subscription is available. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2000);
// Should show position ID
@ -302,6 +306,7 @@ test.describe('Dashboard Pages', () => {
waitUntil: 'domcontentloaded',
});
await page.waitForLoadState('networkidle');
// eslint-disable-next-line no-restricted-syntax -- no event source exists for Ponder indexing lag and UI re-renders; Promise+setTimeout used for polling Ponder over HTTP where no push subscription is available. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2000);
// Should show "not found" state without crashing
@ -345,6 +350,7 @@ test.describe('Dashboard Pages', () => {
waitUntil: 'domcontentloaded',
});
await page.waitForLoadState('networkidle');
// eslint-disable-next-line no-restricted-syntax -- no event source exists for Ponder indexing lag and UI re-renders; Promise+setTimeout used for polling Ponder over HTTP where no push subscription is available. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2000);
// Click owner link → should navigate to wallet page
@ -352,6 +358,7 @@ test.describe('Dashboard Pages', () => {
await expect(ownerLink).toBeVisible({ timeout: 10_000 });
await ownerLink.click();
await page.waitForLoadState('networkidle');
// eslint-disable-next-line no-restricted-syntax -- no event source exists for Ponder indexing lag and UI re-renders; Promise+setTimeout used for polling Ponder over HTTP where no push subscription is available. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2000);
// Should now be on the wallet page

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles. */
import { expect, test } from '@playwright/test';
import { Wallet } from 'ethers';
import { createWalletContext } from '../../setup/wallet-provider';
@ -52,6 +51,7 @@ test.describe('Alex Rivera - Crypto-Curious Newcomer', () => {
// --- Landing Page (Reads Carefully) ---
let pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await takeScreenshot(page, personaName, 'landing-page', report);
@ -83,6 +83,7 @@ test.describe('Alex Rivera - Crypto-Curious Newcomer', () => {
logObservation(personaName, 'No security information visible - makes me nervous to connect wallet', report);
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// --- Decides to Connect Wallet (Cautiously) ---
@ -103,6 +104,7 @@ test.describe('Alex Rivera - Crypto-Curious Newcomer', () => {
// --- Navigate to Stake Page to Learn ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
recordPageVisit('Stake (learning)', page.url(), pageStart, report);
@ -119,6 +121,7 @@ test.describe('Alex Rivera - Crypto-Curious Newcomer', () => {
logObservation(personaName, 'Found info icon - let me read this...', report);
// Try to hover to see tooltip
await infoIcon.hover().catch(() => {});
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
await takeScreenshot(page, personaName, 'reading-info-tooltip', report);
logCopyFeedback(personaName, 'Info tooltips help, but still too technical for total beginners', report);
@ -145,6 +148,7 @@ test.describe('Alex Rivera - Crypto-Curious Newcomer', () => {
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/cheats`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
recordPageVisit('Cheats (confused)', page.url(), pageStart, report);
@ -175,11 +179,13 @@ test.describe('Alex Rivera - Crypto-Curious Newcomer', () => {
recordAction('Buy KRK', false, error.message, report);
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// --- Navigate to Stake (Intimidated) ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
recordPageVisit('Stake (attempting)', page.url(), pageStart, report);
@ -210,10 +216,12 @@ test.describe('Alex Rivera - Crypto-Curious Newcomer', () => {
await takeScreenshot(page, personaName, 'stake-failed', report);
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// --- Check for Progress Indicators ---
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'looking-for-my-position', report);
@ -233,6 +241,7 @@ test.describe('Alex Rivera - Crypto-Curious Newcomer', () => {
logCopyFeedback(personaName, 'Need comparison: "Coinbase: 4% simple. Kraiken: 8-15% but you choose your own risk level"', report);
// --- Final Feelings ---
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'final-state', report);

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles. */
import { test } from '@playwright/test';
import { Wallet } from 'ethers';
import { createWalletContext } from '../../setup/wallet-provider';
@ -102,6 +101,7 @@ test.describe('All Personas - Fresh Pool State', () => {
try {
// 1. Navigate to app
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, persona.shortName, '1-landing', report);
logObservation(persona.shortName, 'Arrived at app', report);
@ -114,6 +114,7 @@ test.describe('All Personas - Fresh Pool State', () => {
// 3. Mint ETH
await page.goto(`${STACK_WEBAPP_URL}/app/cheats`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
await mintEth(page, STACK_RPC_URL, address, persona.ethToMint);
await takeScreenshot(page, persona.shortName, '3-eth-minted', report);
@ -126,10 +127,12 @@ test.describe('All Personas - Fresh Pool State', () => {
recordAction(`Buy KRK with ${persona.ethToSpend} ETH`, true, undefined, report);
console.log(`[${persona.shortName}] ✅ Bought KRK with ${persona.ethToSpend} ETH`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// 5. Navigate to stake page
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await takeScreenshot(page, persona.shortName, '5-stake-page', report);
@ -140,10 +143,12 @@ test.describe('All Personas - Fresh Pool State', () => {
await takeScreenshot(page, persona.shortName, '6-stake-complete', report);
console.log(`[${persona.shortName}] ✅ Staked ${stakeAmount} KRK at ${persona.taxRate}% tax`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// 7. Verify position exists
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
const myPositionsSection = page.locator('.my-positions-list, [class*="my-position"], [class*="MyPosition"]').first();

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles. */
import { expect, test } from '@playwright/test';
import { Wallet } from 'ethers';
import { createWalletContext } from '../../setup/wallet-provider';
@ -52,6 +51,7 @@ test.describe('Marcus "Flash" Chen - Degen/MEV Hunter', () => {
// --- Landing Page ---
let pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'landing-page', report);
@ -88,6 +88,7 @@ test.describe('Marcus "Flash" Chen - Degen/MEV Hunter', () => {
// --- Mint ETH (Cheats) ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/cheats`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
recordPageVisit('Cheats', page.url(), pageStart, report);
@ -106,6 +107,7 @@ test.describe('Marcus "Flash" Chen - Degen/MEV Hunter', () => {
await takeScreenshot(page, personaName, 'small-swap-complete', report);
logTokenomicsQuestion(personaName, 'What\'s the slippage on this tiny swap? Is three-position liquidity working?', report);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// --- Test Larger Swap ---
@ -116,15 +118,18 @@ test.describe('Marcus "Flash" Chen - Degen/MEV Hunter', () => {
await takeScreenshot(page, personaName, 'large-swap-complete', report);
logTokenomicsQuestion(personaName, 'Did I hit the discovery edge? What\'s the actual buy depth?', report);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(5_000);
// Reload page to ensure balance is fresh
await page.reload();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// --- Navigate to Stake Page ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(4_000);
recordPageVisit('Stake', page.url(), pageStart, report);
@ -145,12 +150,14 @@ test.describe('Marcus "Flash" Chen - Degen/MEV Hunter', () => {
await takeScreenshot(page, personaName, 'low-tax-stake-failed', report);
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// --- Try to Snatch Another Position (if visible) ---
logObservation(personaName, 'Scrolling through active positions looking for snatch targets...', report);
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'looking-for-snatch-targets', report);
@ -168,6 +175,7 @@ test.describe('Marcus "Flash" Chen - Degen/MEV Hunter', () => {
// --- Check Statistics ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
const statsVisible = await page.getByText('Statistics').isVisible().catch(() => false);
@ -178,6 +186,7 @@ test.describe('Marcus "Flash" Chen - Degen/MEV Hunter', () => {
}
// --- Final Thoughts ---
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'final-dashboard', report);

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles. */
import { expect, test } from '@playwright/test';
import { Wallet } from 'ethers';
import { createWalletContext } from '../../setup/wallet-provider';
@ -52,6 +51,7 @@ test.describe('Dr. Priya Malhotra - Institutional/Analytical Investor', () => {
// --- Landing Page (Critical Analysis) ---
let pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'landing-page', report);
@ -101,6 +101,7 @@ test.describe('Dr. Priya Malhotra - Institutional/Analytical Investor', () => {
// --- Examine Stake Page Statistics ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
recordPageVisit('Stake (analysis)', page.url(), pageStart, report);
@ -111,6 +112,7 @@ test.describe('Dr. Priya Malhotra - Institutional/Analytical Investor', () => {
// --- Examine Three-Position Liquidity Claim ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/cheats`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
recordPageVisit('Cheats (liquidity analysis)', page.url(), pageStart, report);
@ -154,11 +156,13 @@ test.describe('Dr. Priya Malhotra - Institutional/Analytical Investor', () => {
recordAction('Buy KRK with 5.0 ETH', false, error.message, report);
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// --- Navigate to Stake for Optimal Tax Rate Analysis ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
recordPageVisit('Stake (optimization)', page.url(), pageStart, report);
@ -190,10 +194,12 @@ test.describe('Dr. Priya Malhotra - Institutional/Analytical Investor', () => {
recordAction('Stake 500 KRK at 12% tax', false, error.message, report);
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// --- Review Position Management Interface ---
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'position-management', report);
@ -212,6 +218,7 @@ test.describe('Dr. Priya Malhotra - Institutional/Analytical Investor', () => {
logTokenomicsQuestion(personaName, 'How does this integrate with broader Base ecosystem? Cross-protocol synergies?', report);
// --- Final Assessment ---
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'final-analysis', report);

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles. */
import { expect, test } from '@playwright/test';
import { Wallet } from 'ethers';
import { createWalletContext } from '../../setup/wallet-provider';
@ -52,6 +51,7 @@ test.describe('Sarah Park - Cautious Yield Farmer', () => {
// --- Landing Page (Reads Everything) ---
let pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await takeScreenshot(page, personaName, 'landing-page', report);
@ -93,6 +93,7 @@ test.describe('Sarah Park - Cautious Yield Farmer', () => {
// --- Navigate to Stake Page to Learn ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
recordPageVisit('Stake (research)', page.url(), pageStart, report);
@ -117,6 +118,7 @@ test.describe('Sarah Park - Cautious Yield Farmer', () => {
// --- Mint ETH ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/cheats`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
recordPageVisit('Cheats', page.url(), pageStart, report);
@ -132,6 +134,7 @@ test.describe('Sarah Park - Cautious Yield Farmer', () => {
await takeScreenshot(page, personaName, 'test-purchase-complete', report);
logObservation(personaName, 'Test purchase successful. Now buying more for actual staking.', report);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// --- Buy enough for staking (split to reduce slippage) ---
@ -139,11 +142,13 @@ test.describe('Sarah Park - Cautious Yield Farmer', () => {
recordAction('Buy KRK with 3.0 ETH total', true, undefined, report);
logObservation(personaName, 'Bought more KRK. Now ready to stake.', report);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// --- Navigate Back to Stake ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
recordPageVisit('Stake (attempt)', page.url(), pageStart, report);
@ -167,10 +172,12 @@ test.describe('Sarah Park - Cautious Yield Farmer', () => {
await takeScreenshot(page, personaName, 'stake-error', report);
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// --- Check Active Positions ---
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'checking-my-position', report);
@ -191,6 +198,7 @@ test.describe('Sarah Park - Cautious Yield Farmer', () => {
logCopyFeedback(personaName, 'Needs a "Why Kraiken?" section comparing to traditional staking/lending', report);
// --- Final Thoughts ---
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'final-review', report);

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles. */
import { expect, test } from '@playwright/test';
import { Wallet } from 'ethers';
import { createWalletContext } from '../../setup/wallet-provider';
@ -51,6 +50,7 @@ test.describe('Test A: Passive Holder Journey', () => {
try {
// Step 1: Navigate to landing page
await page.goto(LANDING_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Tyler's quick evaluation
@ -120,6 +120,7 @@ test.describe('Test A: Passive Holder Journey', () => {
try {
await page.goto(LANDING_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
// Click Get KRK button
@ -128,6 +129,7 @@ test.describe('Test A: Passive Holder Journey', () => {
if (buttonVisible) {
await getKrkButton.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Check if navigated to web-app
@ -181,6 +183,7 @@ test.describe('Test A: Passive Holder Journey', () => {
try {
// Navigate to web-app to connect wallet
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Mint ETH and buy KRK programmatically
@ -197,6 +200,7 @@ test.describe('Test A: Passive Holder Journey', () => {
// Navigate back to landing page
await page.goto(LANDING_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Check for reasons to return
@ -254,6 +258,7 @@ test.describe('Test A: Passive Holder Journey', () => {
try {
await page.goto(LANDING_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Reading the page... trying to understand what this protocol does');
@ -321,6 +326,7 @@ test.describe('Test A: Passive Holder Journey', () => {
try {
await page.goto(LANDING_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
// Try to click Get KRK
@ -329,6 +335,7 @@ test.describe('Test A: Passive Holder Journey', () => {
if (buttonVisible) {
await getKrkButton.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Clicked "Get KRK" - now what?');
@ -385,6 +392,7 @@ test.describe('Test A: Passive Holder Journey', () => {
try {
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Simulate getting KRK
@ -400,6 +408,7 @@ test.describe('Test A: Passive Holder Journey', () => {
// Navigate back to landing
await page.goto(LANDING_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Okay, I have KRK now... what should I do with it?');
@ -467,6 +476,7 @@ test.describe('Test A: Passive Holder Journey', () => {
try {
await page.goto(LANDING_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Scanning for key metrics: APY, TVL, risk factors...');
@ -538,6 +548,7 @@ test.describe('Test A: Passive Holder Journey', () => {
try {
await page.goto(LANDING_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
const getKrkButton = page.getByRole('button', { name: /get.*krk/i }).first();
@ -545,6 +556,7 @@ test.describe('Test A: Passive Holder Journey', () => {
if (buttonVisible) {
await getKrkButton.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Evaluating acquisition flow - time is money');
@ -605,6 +617,7 @@ test.describe('Test A: Passive Holder Journey', () => {
try {
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Acquire KRK
@ -621,6 +634,7 @@ test.describe('Test A: Passive Holder Journey', () => {
// Return to landing page
await page.goto(LANDING_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Now holding KRK - what ongoing value does landing page provide?');

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles. */
/**
* Test B: Comprehensive Staker Journey (v2)
*
@ -76,11 +75,13 @@ test.describe('Test B: Staker Journey v2', () => {
try {
observations.push('Navigating to stake page...');
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// Connect wallet
observations.push('Connecting wallet...');
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
const walletDisplay = page.getByText(/0x[a-fA-F0-9]{4}/i).first();
@ -117,8 +118,10 @@ test.describe('Test B: Staker Journey v2', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
observations.push('Looking for my existing position created in setup...');
@ -176,8 +179,10 @@ test.describe('Test B: Staker Journey v2', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
observations.push('Looking for other positions with lower tax rates to snatch...');
@ -192,11 +197,13 @@ test.describe('Test B: Staker Journey v2', () => {
const amountInput = page.getByLabel('Staking Amount').or(page.locator('input[type="number"]').first());
await amountInput.waitFor({ state: 'visible', timeout: 10_000 });
await amountInput.fill('200'); // Amount to snatch
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
// Select HIGHER tax rate than victim (Sarah has index 10, so use index 12+)
const taxSelect = page.locator('select.tax-select').or(page.getByRole('combobox', { name: /tax/i }).first());
await taxSelect.selectOption({ index: 12 }); // Higher than Sarah's medium tax
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
// Check button text
@ -221,6 +228,7 @@ test.describe('Test B: Staker Journey v2', () => {
// Execute snatch
observations.push('Executing snatch transaction...');
await stakeButton.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Wait for transaction completion
@ -234,6 +242,7 @@ test.describe('Test B: Staker Journey v2', () => {
observations.push('⚠ Snatch transaction may be pending');
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// Verify snatched position appears
@ -279,9 +288,11 @@ test.describe('Test B: Staker Journey v2', () => {
try {
observations.push('Sarah connecting to view her staked position...');
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// Look for position
@ -317,8 +328,10 @@ test.describe('Test B: Staker Journey v2', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
observations.push('Analyzing P&L metrics for risk assessment...');
@ -380,8 +393,10 @@ test.describe('Test B: Staker Journey v2', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
observations.push('Exiting position to recover KRK...');
@ -405,6 +420,7 @@ test.describe('Test B: Staker Journey v2', () => {
// Expand position to see actions
await position.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
// Look for Unstake/Exit button
@ -421,10 +437,12 @@ test.describe('Test B: Staker Journey v2', () => {
// Click exit
await exitButton.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// Wait for transaction
try {
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(5_000); // Give time for tx confirmation
observations.push('✓ Exit transaction submitted');
} catch (error) {
@ -432,6 +450,7 @@ test.describe('Test B: Staker Journey v2', () => {
}
// Verify position is gone
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
const stillVisible = await position.isVisible().catch(() => false);
@ -480,9 +499,11 @@ test.describe('Test B: Staker Journey v2', () => {
try {
observations.push('Priya (fresh staker) connecting wallet...');
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// Verify no existing positions
@ -518,8 +539,10 @@ test.describe('Test B: Staker Journey v2', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
observations.push('Filling staking form as a new user...');
@ -531,6 +554,7 @@ test.describe('Test B: Staker Journey v2', () => {
if (hasInput) {
observations.push('✓ Staking Amount input found');
await amountInput.fill('100');
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
observations.push('✓ Filled amount: 100 KRK');
} else {
@ -561,13 +585,16 @@ test.describe('Test B: Staker Journey v2', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// Fill amount first
const amountInput = page.getByLabel('Staking Amount');
await amountInput.fill('100');
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
observations.push('Selecting tax rate...');
@ -581,6 +608,7 @@ test.describe('Test B: Staker Journey v2', () => {
// Select a mid-range tax rate (index 5)
await taxSelect.selectOption({ index: 5 });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
const selectedValue = await taxSelect.inputValue();
@ -614,8 +642,10 @@ test.describe('Test B: Staker Journey v2', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
observations.push('Completing stake form and executing transaction...');
@ -623,10 +653,12 @@ test.describe('Test B: Staker Journey v2', () => {
// Fill form
const amountInput = page.getByLabel('Staking Amount');
await amountInput.fill('100');
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
const taxSelect = page.locator('select.tax-select');
await taxSelect.selectOption({ index: 5 });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
// Find stake button using reference selector
@ -659,6 +691,7 @@ test.describe('Test B: Staker Journey v2', () => {
// Click stake button
observations.push('Clicking stake button...');
await stakeButton.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
// The wallet provider auto-signs, but check for transaction state
@ -666,12 +699,14 @@ test.describe('Test B: Staker Journey v2', () => {
// Wait for transaction completion
try {
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(5_000);
observations.push('✓ Transaction submitted');
} catch (error) {
observations.push('⚠ Transaction may be pending');
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// Screenshot after stake
@ -702,8 +737,10 @@ test.describe('Test B: Staker Journey v2', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
observations.push('Checking for new position in Active Positions...');

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles. */
import { expect, test } from '@playwright/test';
import { Wallet } from 'ethers';
import { createWalletContext } from '../../setup/wallet-provider';
@ -52,6 +51,7 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Setting up: acquiring KRK for staking tests...');
@ -78,6 +78,7 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
observations.push('Scanning for arbitrage angles, tax rate gaps, snatching opportunities...');
@ -105,6 +106,7 @@ test.describe('Test B: Staker Journey', () => {
if (hasTooltip) {
observations.push('✓ Tax rate has tooltip - explains tradeoff');
await infoIcon.hover();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
const tooltipText = await page.locator('[role="tooltip"], .tooltip').textContent().catch(() => '');
@ -170,10 +172,12 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// Connect wallet
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Going for lowest tax rate - maximum upside, I\'ll just monitor for snatches');
@ -182,11 +186,13 @@ test.describe('Test B: Staker Journey', () => {
const stakeAmountInput = page.getByLabel(/staking amount/i).or(page.locator('input[type="number"]').first());
await stakeAmountInput.waitFor({ state: 'visible', timeout: 10_000 });
await stakeAmountInput.fill('100');
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
// Select lowest tax rate (index 0 or value "5")
const taxSelect = page.getByRole('combobox', { name: /tax/i }).first();
await taxSelect.selectOption({ index: 0 }); // Pick first option (lowest)
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
const selectedTax = await taxSelect.inputValue();
@ -209,11 +215,13 @@ test.describe('Test B: Staker Journey', () => {
try {
await stakeButton.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
// Wait for transaction
const txInProgress = await page.getByRole('button', { name: /sign|waiting|confirm/i }).isVisible({ timeout: 3_000 }).catch(() => false);
if (txInProgress) {
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(5_000);
}
@ -223,6 +231,7 @@ test.describe('Test B: Staker Journey', () => {
feedback.overall.friction.push('Could not complete stake transaction');
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// Screenshot after stake
@ -247,9 +256,11 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Checking my position - where\'s the P&L?');
@ -339,6 +350,7 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Funding wallet for conservative staking test...');
@ -364,6 +376,7 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
observations.push('Looking for risk disclosures, worst-case scenarios, and safety features...');
@ -383,6 +396,7 @@ test.describe('Test B: Staker Journey', () => {
observations.push('✓ Tax rate info icon found');
await page.locator('svg[data-icon="circle-info"], svg[class*="info"]').first().hover();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
const tooltipText = await page.locator('[role="tooltip"], .tooltip').textContent().catch(() => '');
@ -445,9 +459,11 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Choosing medium tax rate - balance between returns and safety');
@ -456,6 +472,7 @@ test.describe('Test B: Staker Journey', () => {
const stakeAmountInput = page.getByLabel(/staking amount/i).or(page.locator('input[type="number"]').first());
await stakeAmountInput.waitFor({ state: 'visible', timeout: 10_000 });
await stakeAmountInput.fill('50'); // Conservative amount
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
// Select medium tax rate (index 2-3, or 10-15%)
@ -463,6 +480,7 @@ test.describe('Test B: Staker Journey', () => {
const options = await taxSelect.locator('option').count();
const midIndex = Math.floor(options / 2);
await taxSelect.selectOption({ index: midIndex });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
const selectedTax = await taxSelect.inputValue();
@ -478,10 +496,12 @@ test.describe('Test B: Staker Journey', () => {
try {
await stakeButton.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
const txInProgress = await page.getByRole('button', { name: /sign|waiting|confirm/i }).isVisible({ timeout: 3_000 }).catch(() => false);
if (txInProgress) {
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(5_000);
}
@ -491,6 +511,7 @@ test.describe('Test B: Staker Journey', () => {
feedback.overall.friction.push('Stake transaction failed');
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
const postStakePath = join(screenshotDir, `post-stake-${Date.now()}.png`);
@ -514,9 +535,11 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Evaluating: Can I clearly see my position, returns, and risks?');
@ -599,6 +622,7 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Preparing test wallet...');
@ -624,6 +648,7 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
observations.push('Looking for: docs, contract addresses, audit reports, technical specs...');
@ -702,9 +727,11 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Evaluating UI quality: precision, accuracy, professionalism...');
@ -729,6 +756,7 @@ test.describe('Test B: Staker Journey', () => {
observations.push('Testing edge cases: trying to stake 0...');
const stakeInput = page.getByLabel(/staking amount/i).or(page.locator('input[type="number"]').first());
await stakeInput.fill('0');
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
const hasValidation = await page.locator('text=/invalid|minimum|required/i').isVisible().catch(() => false);
@ -769,9 +797,11 @@ test.describe('Test B: Staker Journey', () => {
try {
await page.goto(STAKE_PAGE_URL, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
await connectWallet(page);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
observations.push('Executing small test stake to evaluate position reporting...');
@ -779,10 +809,12 @@ test.describe('Test B: Staker Journey', () => {
// Fill form
const stakeInput = page.getByLabel(/staking amount/i).or(page.locator('input[type="number"]').first());
await stakeInput.fill('25');
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
const taxSelect = page.getByRole('combobox', { name: /tax/i }).first();
await taxSelect.selectOption({ index: 1 });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(500);
// Execute
@ -790,10 +822,12 @@ test.describe('Test B: Staker Journey', () => {
try {
await stakeButton.click();
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
const txInProgress = await page.getByRole('button', { name: /sign|waiting|confirm/i }).isVisible({ timeout: 3_000 }).catch(() => false);
if (txInProgress) {
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(5_000);
}
@ -802,6 +836,7 @@ test.describe('Test B: Staker Journey', () => {
observations.push(`✗ Stake failed: ${error.message}`);
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// Evaluate position reporting

View file

@ -1,4 +1,3 @@
/* eslint-disable no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles. */
import { expect, test } from '@playwright/test';
import { Wallet } from 'ethers';
import { createWalletContext } from '../../setup/wallet-provider';
@ -52,6 +51,7 @@ test.describe('Tyler "Bags" Morrison - Retail Degen', () => {
// --- Landing Page (Barely Looks) ---
let pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/`, { waitUntil: 'domcontentloaded' });
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
await takeScreenshot(page, personaName, 'landing-page', report);
@ -82,6 +82,7 @@ test.describe('Tyler "Bags" Morrison - Retail Degen', () => {
// --- Navigate to Cheats (Finds It Randomly) ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/cheats`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(1_000);
recordPageVisit('Cheats', page.url(), pageStart, report);
@ -115,11 +116,13 @@ test.describe('Tyler "Bags" Morrison - Retail Degen', () => {
await takeScreenshot(page, personaName, 'buy-error', report);
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(5_000);
// --- Navigate to Stake (No Idea What He's Doing) ---
pageStart = Date.now();
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
recordPageVisit('Stake', page.url(), pageStart, report);
@ -143,10 +146,12 @@ test.describe('Tyler "Bags" Morrison - Retail Degen', () => {
await takeScreenshot(page, personaName, 'stake-failed', report);
}
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(3_000);
// --- Checks for Immediate Gains ---
await page.goto(`${STACK_WEBAPP_URL}/app/stake`);
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'checking-gains', report);
@ -183,6 +188,7 @@ test.describe('Tyler "Bags" Morrison - Retail Degen', () => {
}
// --- Final Thoughts ---
// eslint-disable-next-line no-restricted-syntax -- waitForTimeout: no event source exists for animation settling, wallet connector UI transitions, and debounced state updates in user-simulation tests. See AGENTS.md #Engineering Principles.
await page.waitForTimeout(2_000);
await takeScreenshot(page, personaName, 'final-confused-state', report);