You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

129 lines
4.8 KiB

/**
* @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';
/**
* Note: by default, this test uses the test image API server.
*
* If you want to use your own image API server, you can set the
* VITE_DEFAULT_IMAGE_API_SERVER environment variable to your server's URL
* in the playwright.config-local.ts file.
*
*/
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');
// });