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.
		
		
		
		
		
			
		
			
				
					
					
						
							127 lines
						
					
					
						
							4.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							127 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 { importUserAndCloseOnboarding } 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 importUserAndCloseOnboarding(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();
							 | 
						|
								
							 | 
						|
								  // const recorded = await page.getByText('That gift was recorded.');
							 | 
						|
								  await expect(await 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:first-child').filter({ hasText: finalTitle });
							 | 
						|
								  await expect(item1.getByRole('img', { name: 'Activity image' })).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');
							 | 
						|
								// });
							 | 
						|
								
							 |