"""E2E tests for creating posts. Tests post creation form and submission flows. Note: Most tests require authentication and may be skipped in guest mode. """ import pytest from playwright.sync_api import Page @pytest.mark.e2e class TestPostCreationForm: """Tests for post creation form.""" def test_create_form_loads(self, page: Page, base_url: str) -> None: """Test that create post form loads.""" page.goto(f"{base_url}/web/posts/new") # Form should be present (may redirect to login for guests) if "login" in page.url: pytest.skip("Authentication required") # Check form is visible form = page.locator("[data-testid='form-post']") assert form.is_visible(), "Form should be visible" def test_form_has_required_fields(self, page: Page, base_url: str) -> None: """Test that form has title and content fields.""" page.goto(f"{base_url}/web/posts/new") if "login" in page.url: pytest.skip("Authentication required") # Check fields are visible assert page.locator("[data-testid='input-title']").is_visible() assert page.locator("[data-testid='input-content']").is_visible() assert page.locator("[data-testid='btn-submit-post']").is_visible() def test_cancel_returns_to_list(self, page: Page, base_url: str) -> None: """Test cancel button returns to posts list.""" page.goto(f"{base_url}/web/posts/new") if "login" in page.url: pytest.skip("Authentication required") # Click cancel page.locator("[data-testid='btn-cancel']").click() page.wait_for_load_state("networkidle") # Should be back on home page assert "/web/" in page.url @pytest.mark.e2e class TestPostCreationValidation: """Tests for form validation.""" def test_empty_title_shows_error(self, page: Page, base_url: str) -> None: """Test validation error for empty title.""" page.goto(f"{base_url}/web/posts/new") if "login" in page.url: pytest.skip("Authentication required") # Try to submit empty form page.locator("[data-testid='input-content']").fill("Valid content here") page.locator("[data-testid='btn-submit-post']").click() # Should show error or stay on form assert "new" in page.url or page.locator("[data-testid='error-title']").is_visible() def test_short_content_shows_error(self, page: Page, base_url: str) -> None: """Test validation error for short content.""" page.goto(f"{base_url}/web/posts/new") if "login" in page.url: pytest.skip("Authentication required") # Fill with short content page.locator("[data-testid='input-title']").fill("Valid Title") page.locator("[data-testid='input-content']").fill("Short") page.locator("[data-testid='btn-submit-post']").click() # Should show error or stay on form assert "new" in page.url or page.locator("[data-testid='error-content']").is_visible() @pytest.mark.e2e class TestPostCreationFlow: """Tests for complete post creation flow.""" def test_create_published_post(self, authenticated_page: Page, base_url: str) -> None: """Test creating a published post.""" page = authenticated_page # Navigate to create form page.goto(f"{base_url}/web/posts/new") # Check if redirected to login if "login" in page.url: pytest.skip("Authentication required") # Fill and submit page.locator("[data-testid='input-title']").fill("E2E Test Post") page.locator("[data-testid='input-content']").fill( "This is a test post created by E2E tests. " * 5 ) page.locator("[data-testid='input-tags']").fill("test, e2e") page.locator("[data-testid='checkbox-published']").check() page.locator("[data-testid='btn-submit-post']").click() page.wait_for_load_state("networkidle") # Should be on detail page assert "posts/" in page.url def test_create_draft_post(self, authenticated_page: Page, base_url: str) -> None: """Test creating a draft post.""" page = authenticated_page page.goto(f"{base_url}/web/posts/new") if "login" in page.url: pytest.skip("Authentication required") # Create as draft page.locator("[data-testid='input-title']").fill("E2E Draft Post") page.locator("[data-testid='input-content']").fill("This is a draft post. " * 5) page.locator("[data-testid='checkbox-published']").uncheck() page.locator("[data-testid='btn-submit-post']").click() page.wait_for_load_state("networkidle") # Should be on detail page assert "posts/" in page.url @pytest.mark.e2e class TestPostCreationNavigation: """Tests for navigation to create form.""" def test_create_button_visible_for_logged_users( self, authenticated_page: Page, base_url: str ) -> None: """Test that create button is visible for logged in users.""" page = authenticated_page page.goto(f"{base_url}/web/") # Create button should be visible for authenticated users create_btn = page.locator("[data-testid='btn-create-post-header']") if not create_btn.is_visible(): pytest.skip("Create button not visible") assert create_btn.is_visible(), "Create button should be visible for logged in users" def test_create_button_hidden_for_guests(self, page: Page, base_url: str) -> None: """Test that create button is hidden for guest users.""" page.goto(f"{base_url}/web/") # Check if login link is visible (indicates guest user) login_link = page.locator("a[href='/auth/login']") if not login_link.is_visible(): pytest.skip("Test requires guest user") # Create button should not be visible create_btn = page.locator("[data-testid='btn-create-post-header']") assert not create_btn.is_visible(), "Create button should be hidden for guests"