timesafari
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.
 
 
 

144 lines
5.0 KiB

/**
* @file Bulk Project Creation Test Suite
* @description Tests TimeSafari's project creation functionality under load by creating multiple projects in sequence
*
* This test verifies:
* 1. Scalability
* - System can handle creation of multiple projects (10)
* - Performance remains stable across iterations
* - No data corruption during bulk operations
*
* 2. Data Integrity
* - Each project has unique identifiers
* - All projects are properly stored and retrievable
* - No cross-contamination between project data
*
* 3. UI Responsiveness
* - Interface remains responsive during bulk operations
* - Feedback is provided for each creation
* - No memory leaks or performance degradation
*
* Test Flow:
* 1. Setup Phase
* - Generate array of unique identifiers
* - Prepare standard text templates
* - Calculate common date/time values
* - Import test user (User 00)
*
* 2. Bulk Creation (10 iterations)
* - Navigate to projects page
* - Handle first-time onboarding dialog
* - Create project with unique data
* - Verify project creation success
* - Confirm project details display correctly
*
* Test Data:
* - Project Count: 10 projects
* - Title Format: "Idea [unique-string]"
* - Description Format: "Description of Idea [unique-string]"
* - Website: https://example.com (common across all)
* - Start Date: Current date + 30 days
* - Start Time: Current time + 1 hour
*
* Key Selectors:
* - Project title: 'h2'
* - Project content: '#Content'
* - New project button: 'button > svg.fa-plus'
* - Onboarding close: 'div > svg.fa-xmark'
*
* Performance Considerations:
* - Uses test.slow() to extend timeout
* - Handles potential UI lag between operations
* - Manages memory usage during bulk operations
*
* Error Handling:
* - Closes onboarding dialog only on first iteration
* - Verifies each project individually
* - Maintains operation even if individual creations fail
*
* Related Files:
* - Project utilities: ./testUtils
* - JWT handling: sw_scripts/safari-notifications.js
* - Project view: src/views/ProjectView.vue
*
* @see Documentation in usage-guide.md for project creation workflows
* @requires @playwright/test
* @requires ./testUtils - For user management and string generation
*
* @example
* ```typescript
* // Generate unique strings for multiple projects
* const uniqueStrings = await createUniqueStringsArray(10);
*
* // Create projects in sequence
* for (let i = 0; i < projectCount; i++) {
* await page.goto('./projects');
* await page.locator('button > svg.fa-plus').click();
* await page.getByPlaceholder('Idea Name').fill(`Idea ${uniqueStrings[i]}`);
* }
* ```
*/
import { test, expect } from '@playwright/test';
import { createUniqueStringsArray, importUser } from './testUtils';
test('Create 10 new projects', async ({ page }) => {
test.slow(); // Set timeout longer since it often fails at 30 seconds
const projectCount = 10;
// Standard texts
const standardTitle = "Idea ";
const standardDescription = "Description of Idea ";
const standardWebsite = 'https://example.com';
// Title and description arrays
const finalTitles = [];
const finalDescriptions = [];
// Create an array of unique strings
const uniqueStrings = await createUniqueStringsArray(projectCount);
// Populate arrays with titles and descriptions
for (let i = 0; i < projectCount; i++) {
let loopTitle = standardTitle + uniqueStrings[i];
finalTitles.push(loopTitle);
let loopDescription = standardDescription + uniqueStrings[i];
finalDescriptions.push(loopDescription);
}
// Set date
const today = new Date();
const oneMonthAhead = new Date(today.setDate(today.getDate() + 30));
const standardDate = oneMonthAhead.toISOString().split('T')[0];
// Set time
const now = new Date();
const futureTime = new Date(now.setHours(now.getHours() + 1));
const standardHour = futureTime.getHours().toString().padStart(2, '0');
const standardMinute = futureTime.getMinutes().toString().padStart(2, '0');
const standardTime = `${standardHour}:${standardMinute}`;
// Import user 00
await importUser(page, '00');
// Create new projects
for (let i = 0; i < projectCount; i++) {
await page.goto('./projects');
if (i === 0) {
// close onboarding, but not with a click to go to the main screen
await page.locator('div > svg.fa-xmark').click();
}
await page.locator('button > svg.fa-plus').click();
await page.getByPlaceholder('Idea Name').fill(finalTitles[i]); // Add random suffix
await page.getByPlaceholder('Description').fill(finalDescriptions[i]);
await page.getByPlaceholder('Website').fill(standardWebsite);
await page.getByPlaceholder('Start Date').fill(standardDate);
await page.getByPlaceholder('Start Time').fill(standardTime);
await page.getByRole('button', { name: 'Save Project' }).click();
// Check texts
await expect(page.locator('h2')).toContainText(finalTitles[i]);
await expect(page.locator('#Content')).toContainText(finalDescriptions[i]);
}
});