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

136 lines
5.2 KiB
Python

import pytest
import playwright.sync_api
from playwright.sync_api import expect
import random
def test_folder_deletion_and_resync_flow(playwright: playwright.sync_api.Playwright):
"""
Test the complete folder deletion and resync flow:
1. Navigate to localhost:5001
2. Create a new user
3. Configure IMAP with specified details
4. Sync folders and verify they exist
5. Delete all folders
6. Verify folders are deleted
7. Resync folders
8. Verify folders reappear
"""
# Launch browser
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
try:
# Generate unique data for this test run
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 4: 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 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", timeout=10000)
# Wait for at least 3 folder cards to be visible (based on existing test)
page.wait_for_function("document.querySelectorAll('.card.bg-base-100.shadow-xl').length >= 3", timeout=15000)
# Get the count of folder cards
folder_cards_before = page.locator(".card.bg-base-100.shadow-xl")
count_before = folder_cards_before.count()
print(f"Found {count_before} folder cards before deletion")
# Verify we have at least 3 folder cards
assert count_before >= 3, f"Expected at least 3 folder cards, but found {count_before}"
# Step 6: Delete all folders
# Find all delete buttons for folders
delete_buttons = page.locator(".delete-button")
print(f"Found {delete_buttons.count()} folders to delete")
# Click each delete button to delete all folders
while delete_buttons.count() > 0:
# Get the delete button and click it
delete_button = delete_buttons.nth(0)
delete_button.click()
# Wait for the deletion to process and UI to update
page.wait_for_timeout(1000) # Small delay to allow processing
page.on('dialog', lambda dialog: dialog.accept())
# Wait for the folder card to be removed from the DOM
page.wait_for_load_state("networkidle")
delete_buttons = page.locator(".delete-button")
# Wait for final state to settle
# Step 7: Verify folders are deleted
folder_cards_after_delete = page.locator(".card.bg-base-100.shadow-xl")
count_after_delete = folder_cards_after_delete.count()
print(f"Found {count_after_delete} folder cards after deletion")
# Verify all folders are deleted
assert count_after_delete == 0, f"Expected 0 folder cards after deletion, but found {count_after_delete}"
finally:
# Close browser
browser.close()