mirror of
https://github.com/spliit-app/spliit.git
synced 2026-02-08 00:26:12 +01:00
- Implement Priority 1 E2E test coverage for critical user journeys: * Group lifecycle management (creation, navigation, editing) * Basic expense management (create, view, edit, delete) * Balance calculation and verification * Multiple expense scenarios and split calculations - Add comprehensive reliability infrastructure: * ReliabilityUtils class with retry mechanisms and enhanced navigation * Page Object Model (POM) architecture for maintainable tests * Test data management utilities with unique identifiers * Enhanced Playwright configuration with increased timeouts and retries - Fix all flaky test issues: * Add required test IDs to UI components for reliable element targeting * Implement multiple fallback strategies for element selection * Enhanced tab navigation with URL verification and retry logic * Proper wait strategies for network idle states and dynamic content - Test results: 39/39 tests passing (100% success rate) across all browsers 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
52 lines
1.5 KiB
TypeScript
52 lines
1.5 KiB
TypeScript
import { Locator, Page } from '@playwright/test'
|
|
|
|
export class SettingsPage {
|
|
page: Page
|
|
groupNameInput: Locator
|
|
currencyInput: Locator
|
|
informationTextarea: Locator
|
|
saveButton: Locator
|
|
participantsList: Locator
|
|
|
|
constructor(page: Page) {
|
|
this.page = page
|
|
this.groupNameInput = page.getByTestId('group-name-input')
|
|
this.currencyInput = page.getByTestId('group-currency-input')
|
|
this.informationTextarea = page.getByTestId('group-information-input')
|
|
this.saveButton = page.getByTestId('save-group-button')
|
|
this.participantsList = page.getByTestId('participants-list')
|
|
}
|
|
|
|
async navigateToGroupSettings(groupId: string) {
|
|
await this.page.goto(`http://localhost:3002/groups/${groupId}/edit`)
|
|
}
|
|
|
|
async updateGroupName(newName: string) {
|
|
await this.groupNameInput.fill(newName)
|
|
}
|
|
|
|
async updateCurrency(newCurrency: string) {
|
|
await this.currencyInput.fill(newCurrency)
|
|
}
|
|
|
|
async updateInformation(newInfo: string) {
|
|
await this.informationTextarea.fill(newInfo)
|
|
}
|
|
|
|
async addParticipant(participantName: string) {
|
|
const addButton = this.page.getByTestId('add-participant-button')
|
|
await addButton.click()
|
|
|
|
const newParticipantInput = this.page.getByTestId('new-participant-input')
|
|
await newParticipantInput.fill(participantName)
|
|
}
|
|
|
|
async removeParticipant(participantName: string) {
|
|
const removeButton = this.page.getByTestId(`remove-participant-${participantName}`)
|
|
await removeButton.click()
|
|
}
|
|
|
|
async saveChanges() {
|
|
await this.saveButton.click()
|
|
}
|
|
} |