import { test, expect, Page } from '@playwright/test'; test.use({ storageState: './storageState.json', }); test('Investment process test', async ({ page }) => { await page.goto('http://127.0.0.1:3000/'); // Navigate to the investment page // await page.getByRole('link', { name: 'Card image NVDA Founded in' }).click(); await page.click('a[href="/invest"]'); await page.getByRole('button', { name: 'Invest in NVIDIA' }).click(); // Fill investment amount await fillInvestmentAmount(page, '10000'); // Fill card information await fillCardInformation(page, { name: 'Dummy', city: 'Bangkok', cardNumber: '4111 1111 1111 1111', expirationMonth: 'August', expirationYear: '2032', cvc: '111', }); // Accept terms await acceptTerms(page, [ 'Minimum Investment', 'Investment Horizon', 'Fees', 'Returns', ]); // Click Invest button and confirm await page.getByRole('button', { name: 'Invest' }).click(); await page.getByRole('button', { name: 'Confirm' }).click(); // Ensure error message is displayed when not all terms are accepted await ensureErrorMessageDisplayed(page, 'Please accept all terms'); // Close the error dialog await closeErrorDialog(page); // Accept remaining terms await acceptTerms(page, [ 'Risk Disclosure', 'Withdrawal Policy', ]); // Click Invest button and confirm again await page.getByRole('button', { name: 'Invest' }).click(); await page.getByRole('button', { name: 'Confirm' }).click(); // Ensure that success toast is displayed when investment is successful await expect( page.locator('div[role="status"][aria-live="polite"]').filter({ hasText: /^You successfully invested!$/ }) ).toBeVisible(); // Helper functions async function fillInvestmentAmount(page: Page, amount: string): Promise { await page.getByPlaceholder('min $').click(); await page.getByPlaceholder('min $').fill(amount); } interface CardInfo { name: string; city: string; cardNumber: string; expirationMonth: string; expirationYear: string; cvc: string; } async function fillCardInformation( page: Page, { name, city, cardNumber, expirationMonth, expirationYear, cvc }: CardInfo ): Promise { await page.getByPlaceholder('First Last').click(); await page.getByPlaceholder('First Last').fill(name); await page.getByLabel('City').click(); await page.getByLabel('City').fill(city); await page.getByLabel('Card number').click(); await page.getByLabel('Card number').fill(cardNumber); await page.getByLabel('Month').click(); await page.getByText(expirationMonth).click(); await page.getByLabel('Year').click(); await page.getByLabel(expirationYear).click(); await page.getByPlaceholder('CVC').click(); await page.getByPlaceholder('CVC').fill(cvc); } async function acceptTerms(page: Page, terms: string[]): Promise { for (const term of terms) { await page.getByRole('row', { name: new RegExp(term) }).getByRole('checkbox').check(); } } async function ensureErrorMessageDisplayed(page: Page, message: string): Promise { await expect(page.getByText(message)).toBeVisible(); } async function closeErrorDialog(page: Page): Promise { await page.getByRole('button', { name: 'Close' }).first().click(); } });