From 65c00e062b74e42a7981cb12e61abf4c32b46cd0 Mon Sep 17 00:00:00 2001 From: Bryce Date: Thu, 7 Aug 2025 21:39:08 -0700 Subject: [PATCH] tests --- .../test_folder_deletion_and_resync.py | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 tests/functional/test_folder_deletion_and_resync.py diff --git a/tests/functional/test_folder_deletion_and_resync.py b/tests/functional/test_folder_deletion_and_resync.py new file mode 100644 index 0000000..6516918 --- /dev/null +++ b/tests/functional/test_folder_deletion_and_resync.py @@ -0,0 +1,137 @@ +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("button:has-text('Configure Folder Types')") + + # Step 5: Sync folders and verify they exist + # Click the "Configure Folder Types" button + page.click("button:has-text('Configure Folder Types')") + + # 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", 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() \ No newline at end of file