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.
		
		
		
		
		
			
		
			
				
					
					
						
							136 lines
						
					
					
						
							4.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							136 lines
						
					
					
						
							4.7 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"]'
							 | 
						|
								 * - Submit button: '[name="Sign & Send"]'
							 | 
						|
								 * - Success alert: 'div[role="alert"]'
							 | 
						|
								 * - Alert dismiss: 'button > svg.fa-xmark'
							 | 
						|
								 * 
							 | 
						|
								 * Performance Considerations:
							 | 
						|
								 * - Limited to 9 gifts to avoid timeout
							 | 
						|
								 * - Handles UI lag between operations
							 | 
						|
								 * - Manages memory usage during bulk operations
							 | 
						|
								 * 
							 | 
						|
								 * Error Handling:
							 | 
						|
								 * - Closes onboarding dialog only on first iteration
							 | 
						|
								 * - Verifies each gift individually
							 | 
						|
								 * - Maintains operation even if individual recordings fail
							 | 
						|
								 * 
							 | 
						|
								 * Related Files:
							 | 
						|
								 * - Gift recording view: src/views/RecordGiftView.vue
							 | 
						|
								 * - JWT creation: sw_scripts/safari-notifications.js
							 | 
						|
								 * - Endorser API: src/libs/endorserServer.ts
							 | 
						|
								 * - Test utilities: ./testUtils.ts
							 | 
						|
								 * 
							 | 
						|
								 * @see Documentation in usage-guide.md for gift recording workflows
							 | 
						|
								 * @requires @playwright/test
							 | 
						|
								 * @requires ./testUtils - For user management and array generation
							 | 
						|
								 * 
							 | 
						|
								 * @example
							 | 
						|
								 * ```typescript
							 | 
						|
								 * // Generate test data arrays
							 | 
						|
								 * const uniqueStrings = await createUniqueStringsArray(giftCount);
							 | 
						|
								 * const randomNumbers = await createRandomNumbersArray(giftCount);
							 | 
						|
								 * 
							 | 
						|
								 * // Record gifts in sequence
							 | 
						|
								 * for (let i = 0; i < giftCount; i++) {
							 | 
						|
								 *   await page.goto('./');
							 | 
						|
								 *   await page.getByPlaceholder('What was given').fill(finalTitles[i]);
							 | 
						|
								 *   await page.getByRole('spinbutton').fill(finalNumbers[i].toString());
							 | 
						|
								 *   await page.getByRole('button', { name: 'Sign & Send' }).click();
							 | 
						|
								 * }
							 | 
						|
								 * ```
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								import { test, expect } from '@playwright/test';
							 | 
						|
								import { UNNAMED_ENTITY_NAME } from '../src/constants/entities';
							 | 
						|
								import { importUser, createUniqueStringsArray, createRandomNumbersArray  } from './testUtils';
							 | 
						|
								
							 | 
						|
								test('Record 9 new gifts', async ({ page }) => {
							 | 
						|
								  test.slow(); // Set timeout longer
							 | 
						|
								
							 | 
						|
								  const giftCount = 9;
							 | 
						|
								  const standardTitle = 'Gift ';
							 | 
						|
								  const finalTitles = [];
							 | 
						|
								  const finalNumbers = [];
							 | 
						|
								
							 | 
						|
								  // Create arrays for field input
							 | 
						|
								  const uniqueStrings = await createUniqueStringsArray(giftCount);
							 | 
						|
								  const randomNumbers = await createRandomNumbersArray(giftCount);
							 | 
						|
								
							 | 
						|
								  // Populate arrays
							 | 
						|
								  for (let i = 0; i < giftCount; i++) {
							 | 
						|
								    finalTitles.push(standardTitle + uniqueStrings[i]);
							 | 
						|
								    finalNumbers.push(randomNumbers[i]);
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  // Import user 00
							 | 
						|
								  await importUser(page, '00');
							 | 
						|
								
							 | 
						|
								  // Record new gifts with optimized waiting
							 | 
						|
								  for (let i = 0; i < giftCount; i++) {
							 | 
						|
								    // Record gift
							 | 
						|
								    await page.goto('./', { waitUntil: 'networkidle' });
							 | 
						|
								    if (i === 0) {
							 | 
						|
								      await page.getByTestId('closeOnboardingAndFinish').click();
							 | 
						|
								    }
							 | 
						|
								    await page.getByRole('button', { name: 'Person' }).click();
							 | 
						|
								    await page.getByRole('listitem').filter({ hasText: UNNAMED_ENTITY_NAME }).locator('svg').click();
							 | 
						|
								    await page.getByPlaceholder('What was given').fill(finalTitles[i]);
							 | 
						|
								    await page.getByRole('spinbutton').fill(finalNumbers[i].toString());
							 | 
						|
								    await page.getByRole('button', { name: 'Sign & Send' }).click();
							 | 
						|
								    
							 | 
						|
								    // Wait for success and dismiss
							 | 
						|
								    await expect(page.getByText('That gift was recorded.')).toBeVisible();
							 | 
						|
								    await page.locator('div[role="alert"] button > svg.fa-xmark').click();
							 | 
						|
								
							 | 
						|
								    // Verify gift in list with network idle wait
							 | 
						|
								    await page.goto('./', { waitUntil: 'networkidle' });
							 | 
						|
								    await expect(page.locator('ul#listLatestActivity li')
							 | 
						|
								      .filter({ hasText: finalTitles[i] })
							 | 
						|
								      .first())
							 | 
						|
								      .toBeVisible({ timeout: 3000 });
							 | 
						|
								  }
							 | 
						|
								});
							 |