forked from jsnbuchanan/crowd-funder-for-time-pwa
- Add detailed header documentation to playwright tests - Document test categories and flows - Add key selector documentation - Document state verification and alert handling - Include code examples and usage patterns - Add important checks and requirements The documentation helps developers understand the foundational tests that verify basic application functionality before running more complex test suites.
128 lines
6.3 KiB
TypeScript
128 lines
6.3 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { importUser } from './testUtils';
|
|
|
|
test('Record an offer', async ({ page }) => {
|
|
test.setTimeout(45000);
|
|
|
|
// Generate a random string of 3 characters, skipping the "0." at the beginning
|
|
const randomString = Math.random().toString(36).substring(2, 5);
|
|
// Standard title prefix
|
|
const description = `Offering of ${randomString}`;
|
|
const updatedDescription = `Updated ${description}`;
|
|
const randomNonZeroNumber = Math.floor(Math.random() * 998) + 1;
|
|
|
|
// Switch to user 0
|
|
await importUser(page);
|
|
|
|
// Select a project
|
|
await page.goto('./discover');
|
|
await page.getByTestId('closeOnboardingAndFinish').click();
|
|
await page.locator('ul#listDiscoverResults li:nth-child(1)').click();
|
|
|
|
// Record an offer
|
|
await page.locator('button', { hasText: 'Edit' }).isVisible(); // since the 'edit' takes longer to show, wait for that (lest the click miss)
|
|
await page.getByTestId('offerButton').click();
|
|
await page.getByTestId('inputDescription').fill(description);
|
|
await page.getByTestId('inputOfferAmount').fill(randomNonZeroNumber.toString());
|
|
expect(page.getByRole('button', { name: 'Sign & Send' }));
|
|
await page.getByRole('button', { name: 'Sign & Send' }).click();
|
|
await expect(page.getByText('That offer was recorded.')).toBeVisible();
|
|
await page.locator('div[role="alert"] button > svg.fa-xmark').click(); // dismiss info alert
|
|
|
|
// go to the offer and check the values
|
|
await page.goto('./projects');
|
|
await page.getByRole('link', { name: 'Offers', exact: true }).click();
|
|
await page.locator('li').filter({ hasText: description }).locator('a').first().click();
|
|
await expect(page.getByRole('heading', { name: 'Verifiable Claim Details' })).toBeVisible();
|
|
await expect(page.getByText(description, { exact: true })).toBeVisible();
|
|
await expect(page.getByText('Offered to a bigger plan')).toBeVisible();
|
|
|
|
const serverPagePromise = page.waitForEvent('popup');
|
|
// expand the Details section to see the extended details
|
|
await page.getByRole('heading', { name: 'Details', exact: true }).click();
|
|
await page.getByRole('link', { name: 'View on the Public Server' }).click();
|
|
const serverPage = await serverPagePromise;
|
|
await expect(serverPage.getByText(description)).toBeVisible();
|
|
await expect(serverPage.getByText('did:none:HIDDEN')).toBeVisible();
|
|
|
|
// Now update that offer
|
|
|
|
// find the edit page and check the old values again
|
|
await page.goto('./projects');
|
|
await page.getByRole('link', { name: 'Offers', exact: true }).click();
|
|
await page.locator('li').filter({ hasText: description }).locator('a').first().click();
|
|
await page.getByTestId('editClaimButton').click();
|
|
await page.locator('heading', { hasText: 'What is offered' }).isVisible();
|
|
const itemDesc = await page.getByTestId('itemDescription');
|
|
await expect(itemDesc).toHaveValue(description);
|
|
const amount = await page.getByTestId('inputOfferAmount');
|
|
await expect(amount).toHaveValue(randomNonZeroNumber.toString());
|
|
// update the values
|
|
await itemDesc.fill(updatedDescription);
|
|
await amount.fill(String(randomNonZeroNumber + 1));
|
|
await page.getByRole('button', { name: 'Sign & Send' }).click();
|
|
await expect(page.getByText('That offer was recorded.')).toBeVisible();
|
|
await page.locator('div[role="alert"] button > svg.fa-xmark').click(); // dismiss info alert
|
|
|
|
// go to the offer claim again and check the updated values
|
|
await page.goto('./projects');
|
|
await page.getByRole('link', { name: 'Offers', exact: true }).click();
|
|
await page.locator('li').filter({ hasText: description }).locator('a').first().click();
|
|
const newItemDesc = page.getByTestId('description');
|
|
await expect(newItemDesc).toHaveText(updatedDescription);
|
|
|
|
// go to edit page
|
|
await page.getByTestId('editClaimButton').click();
|
|
const newAmount = page.getByTestId('inputOfferAmount');
|
|
await expect(newAmount).toHaveValue((randomNonZeroNumber + 1).toString());
|
|
|
|
// go to the home page and check that the offer is shown as new
|
|
await page.goto('./');
|
|
const offerNumElem = page.getByTestId('newOffersToUserProjectsActivityNumber');
|
|
// extract the number and check that it's greater than 0 or "50+"
|
|
const offerNumText = await offerNumElem.textContent();
|
|
if (offerNumText === null) {
|
|
throw new Error('Expected Activity Number greater than 0 but got null.');
|
|
} else if (offerNumText === '50+') {
|
|
// we're OK
|
|
} else if (parseInt(offerNumText) > 0) {
|
|
// we're OK
|
|
} else {
|
|
throw new Error(`Expected Activity Number of greater than 0 but got ${offerNumText}.`);
|
|
}
|
|
|
|
// click on the number of new offers to go to the list page
|
|
await offerNumElem.click();
|
|
await expect(page.getByText('New Offers To Your Projects', { exact: true })).toBeVisible();
|
|
// get the icon child of the showOffersToUserProjects
|
|
await page.getByTestId('showOffersToUserProjects').locator('div > svg.fa-chevron-right').click();
|
|
await expect(page.getByText(description)).toBeVisible();
|
|
});
|
|
|
|
test('Affirm delivery of an offer', async ({ page }) => {
|
|
// go to the home page and check that the offer is shown as new
|
|
await importUser(page);
|
|
await page.goto('./');
|
|
await page.getByTestId('closeOnboardingAndFinish').click();
|
|
const offerNumElem = page.getByTestId('newOffersToUserProjectsActivityNumber');
|
|
await expect(offerNumElem).toBeVisible();
|
|
|
|
// click on the number of new offers to go to the list page
|
|
await offerNumElem.click();
|
|
// get the link that comes after the showOffersToUserProjects and click it
|
|
await page.getByTestId('showOffersToUserProjects').locator('a').click();
|
|
// get the first item of the list and click on the icon with file-lines
|
|
const firstItem = page.getByTestId('listRecentOffersToUserProjects').locator('li').first();
|
|
await expect(firstItem).toBeVisible();
|
|
await firstItem.locator('svg.fa-file-lines').click();
|
|
await expect(page.getByText('Verifiable Claim Details', { exact: true })).toBeVisible();
|
|
// click on the 'Affirm Delivery' button
|
|
await page.getByRole('button', { name: 'Affirm Delivery' }).click();
|
|
// fill our offer info and submit
|
|
await page.getByPlaceholder('What was given').fill('Whatever the offer says');
|
|
await page.getByRole('spinbutton').fill('2');
|
|
await page.getByRole('button', { name: 'Sign & Send' }).click();
|
|
await expect(page.getByText('That gift was recorded.')).toBeVisible();
|
|
await page.locator('div[role="alert"] button > svg.fa-xmark').click(); // dismiss info alert
|
|
});
|