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.
122 lines
4.5 KiB
TypeScript
122 lines
4.5 KiB
TypeScript
/**
|
|
* @file Bulk Gift Recording Test Suite
|
|
* @description Tests TimeSafari's gift recording functionality under load by creating
|
|
* multiple gift records in sequence. Limited to 9 gifts to stay under 30-second timeout.
|
|
*
|
|
* This test verifies:
|
|
* 1. Scalability
|
|
* - System handles multiple gift recordings (9)
|
|
* - Performance remains stable across iterations
|
|
* - No data corruption during bulk operations
|
|
*
|
|
* 2. Data Integrity
|
|
* - Each gift has unique identifiers
|
|
* - All gifts properly stored and retrievable
|
|
* - No cross-contamination between gift data
|
|
*
|
|
* 3. UI/UX Stability
|
|
* - Interface remains responsive during bulk operations
|
|
* - Success notifications display correctly
|
|
* - Alert dismissal works consistently
|
|
*
|
|
* Test Flow:
|
|
* 1. Setup Phase
|
|
* - Generate arrays of unique strings for titles
|
|
* - Generate array of random numbers for amounts
|
|
* - Import User 00 (test account)
|
|
*
|
|
* 2. Bulk Recording (9 iterations)
|
|
* - Navigate to home
|
|
* - Handle first-time onboarding dialog
|
|
* - Select recipient (Unnamed/Unknown)
|
|
* - Fill gift details from arrays
|
|
* - Sign and submit
|
|
* - Verify success
|
|
* - Dismiss notification
|
|
* - Verify gift in list
|
|
*
|
|
* Test Data:
|
|
* - Gift Count: 9 (optimized for timeout limits)
|
|
* - Title Format: "Gift [unique-string]"
|
|
* - Amount: Random numbers array
|
|
* - Recipient: "Unnamed/Unknown" (constant)
|
|
*
|
|
* Key Selectors:
|
|
* - Gift input: '[placeholder="What was given"]'
|
|
* - Amount input: '[role="spinbutton"]'
|
|
*
|
|
*/
|
|
import path from 'path';
|
|
import { test, expect } from '@playwright/test';
|
|
import { importUser } from './testUtils';
|
|
|
|
test('Record item given from image-share', async ({ page }) => {
|
|
|
|
let randomString = Math.random().toString(36).substring(2, 8);
|
|
|
|
// Combine title prefix with the random string
|
|
const finalTitle = `Gift ${randomString} from image-share`;
|
|
|
|
await importUser(page, '00');
|
|
|
|
// Record something given
|
|
await page.goto('./test');
|
|
|
|
const fileChooserPromise = page.waitForEvent('filechooser');
|
|
await page.getByTestId('fileInput').click();
|
|
const fileChooser = await fileChooserPromise;
|
|
await fileChooser.setFiles(path.join(__dirname, '..', 'public', 'img', 'icons', 'android-chrome-192x192.png'));
|
|
await page.getByTestId('fileUploadButton').click();
|
|
|
|
// on shared photo page, choose the gift option
|
|
await page.getByRole('button').filter({ hasText: /gift/i }).click();
|
|
|
|
await page.getByTestId('imagery').getByRole('img').isVisible();
|
|
await page.getByPlaceholder('What was received').fill(finalTitle);
|
|
await page.getByRole('spinbutton').fill('2');
|
|
await page.getByRole('button', { name: 'Sign & Send' }).click();
|
|
|
|
// we end up on a page with the onboarding info
|
|
await page.getByTestId('closeOnboardingAndFinish').click();
|
|
|
|
await expect(page.getByText('That gift was recorded.')).toBeVisible();
|
|
await page.locator('div[role="alert"] button > svg.fa-xmark').click(); // dismiss info alert
|
|
|
|
// Refresh home view and check gift
|
|
await page.goto('./');
|
|
const item1 = page.locator('li').filter({ hasText: finalTitle });
|
|
await expect(item1.getByRole('img')).toBeVisible();
|
|
});
|
|
|
|
// // I believe there's a way to test this service worker feature.
|
|
// // The following is what I got from ChatGPT. I wonder if it doesn't work because it's not registering the service worker correctly.
|
|
//
|
|
// test('Trigger a photo-sharing fetch event in service worker with POST to /share-target', async ({ page }) => {
|
|
// await importUser(page, '00');
|
|
//
|
|
// // Create a FormData object with a photo
|
|
// const photoPath = path.join(__dirname, '..', 'public', 'img', 'icons', 'android-chrome-192x192.png');
|
|
// const photoContent = await fs.readFileSync(photoPath);
|
|
// const [response] = await Promise.all([
|
|
// page.waitForResponse(response => response.url().includes('/share-target')), // also check for response.status() === 303 ?
|
|
// page.evaluate(async (photoContent) => {
|
|
// const formData = new FormData();
|
|
// formData.append('photo', new Blob([photoContent], { type: 'image/png' }), 'test-photo.jpg');
|
|
//
|
|
// const response = await fetch('/share-target', {
|
|
// method: 'POST',
|
|
// body: formData,
|
|
// });
|
|
//
|
|
// return response;
|
|
// }, photoContent)
|
|
// ]);
|
|
//
|
|
// // Verify the response redirected to /shared-photo
|
|
// //expect(response.status).toBe(303);
|
|
// console.log('response headers', response.headers());
|
|
// console.log('response status', response.status());
|
|
// console.log('response url', response.url());
|
|
// expect(response.url()).toContain('/shared-photo');
|
|
// });
|