Files
email-organizer/tests/functional/test_full_user_flow.py
2025-08-09 20:36:18 -07:00

111 lines
3.9 KiB
Python

import pytest
import playwright.sync_api
from playwright.sync_api import expect
import uuid
import time
def test_full_user_flow(playwright: playwright.sync_api.Playwright):
"""
Test the complete user flow:
1. Navigate to localhost:5001
2. Go to signup page from login
3. Create a new user
4. Configure IMAP with specified details
5. Sync folders
6. Verify at least 3 folder cards are displayed
"""
# Launch browser
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
try:
# Generate unique data for this test run
import random
random_number = random.randint(1000, 9999)
test_email = f"testuser{random_number}@example.com"
test_username = f"user{random_number}"
# Step 1: Navigate to localhost:5000 (login page)
page.goto("http://localhost:5001")
# Wait for page to load
page.wait_for_load_state("networkidle")
# Step 2: Navigate to signup page
# Click the "Sign up" link
page.click("a:has-text('Sign up')")
# Wait for navigation to complete
page.wait_for_load_state("networkidle")
# Step 3: Create a new user
# Fill out signup form
page.fill("input[name='first_name']", "Test")
page.fill("input[name='last_name']", "User")
page.fill("input[name='email']", test_email)
page.fill("input[name='password']", "TestPassword123")
page.fill("input[name='confirm_password']", "TestPassword123")
page.check("input[name='terms']")
# Submit signup form
page.click("button:has-text('Create Account')")
# Wait for navigation to complete
page.wait_for_load_state("networkidle")
# Step 3: Configure IMAP
# Wait for and click the "Configure IMAP" button
configure_button = page.locator("button:has-text('Configure IMAP')")
configure_button.click()
# Wait for modal to appear
page.wait_for_selector("#imap-modal")
# Fill out IMAP configuration form
page.fill("input[name='server']", "localhost")
page.fill("input[name='port']", "5143")
page.fill("input[name='username']", "user1@example.com")
page.fill("input[name='password']", "password1")
# Uncheck SSL checkbox
page.uncheck("input[name='use_ssl']")
# Submit IMAP configuration form
page.click("button[type='submit']")
# Wait for connection test to complete
page.wait_for_selector("h3:has-text('Configure IMAP Folders')")
# Step 5: Click "Save and Continue" on the final modal
page.click("button:has-text('Save and Continue')")
# Wait for modal to close and navigation to complete
page.wait_for_load_state("networkidle")
# Wait for modal to appear and folders to sync
page.wait_for_selector("#folders-list .card", timeout=10000)
# Step 6: Verify at least 3 folder cards are displayed
folder_cards = page.locator(".card.bg-base-100.shadow-xl")
# Wait for at least 3 folder cards to be visible
page.wait_for_function("document.querySelectorAll('.card.bg-base-100.shadow-xl').length >= 3", timeout=15000)
# Get the count of folder cards
count = folder_cards.count()
print(f"Found {count} folder cards")
# Verify we have at least 3 folder cards
assert count >= 3, f"Expected at least 3 folder cards, but found {count}"
# Verify each folder card has the expected structure
for i in range(min(3, count)):
card = folder_cards.nth(i)
expect(card).to_be_visible()
finally:
# Close browser
browser.close()