E2E authentication flow test.
| 40 | |
| 41 | |
| 42 | class AuthFlowTest: |
| 43 | """E2E authentication flow test.""" |
| 44 | |
| 45 | def __init__(self, base_url: str = BASE_URL): |
| 46 | self.base_url = base_url.rstrip("/") |
| 47 | self.session = requests.Session() |
| 48 | self.test_email = f"{TEST_EMAIL_PREFIX}{uuid.uuid4().hex[:8]}{TEST_EMAIL_DOMAIN}" |
| 49 | self.results = [] |
| 50 | |
| 51 | def log_result(self, step: str, success: bool, details: str = ""): |
| 52 | """Log test result.""" |
| 53 | status = "PASS" if success else "FAIL" |
| 54 | msg = f"[{status}] {step}" |
| 55 | if details: |
| 56 | msg += f" - {details}" |
| 57 | logger.info(msg) |
| 58 | self.results.append({"step": step, "success": success, "details": details, "timestamp": datetime.now().isoformat()}) |
| 59 | |
| 60 | def step_signup(self) -> bool: |
| 61 | """Step 1: Signup with test user.""" |
| 62 | try: |
| 63 | response = self.session.post( |
| 64 | f"{self.base_url}/api/signup", |
| 65 | data={"email": self.test_email, "password": TEST_PASSWORD}, |
| 66 | allow_redirects=False, |
| 67 | ) |
| 68 | |
| 69 | # Signup should return 200 (JSON) or 303 (redirect) |
| 70 | if response.status_code in [200, 303]: |
| 71 | self.log_result("Signup", True, f"Created user {self.test_email}") |
| 72 | return True |
| 73 | else: |
| 74 | self.log_result("Signup", False, f"Status {response.status_code}: {response.text[:200]}") |
| 75 | return False |
| 76 | except Exception as e: |
| 77 | self.log_result("Signup", False, str(e)) |
| 78 | return False |
| 79 | |
| 80 | def step_verify_logged_in(self) -> bool: |
| 81 | """Verify user is logged in via current-user endpoint.""" |
| 82 | try: |
| 83 | response = self.session.get(f"{self.base_url}/api/current-user") |
| 84 | if response.status_code == 200: |
| 85 | data = response.json() |
| 86 | if data.get("email") == self.test_email: |
| 87 | self.log_result("Verify Login", True, f"Logged in as {self.test_email}") |
| 88 | return True |
| 89 | else: |
| 90 | self.log_result("Verify Login", False, f"Wrong email: {data.get('email')}") |
| 91 | return False |
| 92 | else: |
| 93 | self.log_result("Verify Login", False, f"Status {response.status_code}") |
| 94 | return False |
| 95 | except Exception as e: |
| 96 | self.log_result("Verify Login", False, str(e)) |
| 97 | return False |
| 98 | |
| 99 | def step_logout(self) -> bool: |