CP_AUTOMATION/tests/student_authentication/test_04_complete_student_flow.py
2025-12-12 19:54:54 +05:30

120 lines
5.4 KiB
Python

"""
Complete Student Flow Test Cases
Tests the complete student journey in correct sequence:
1. Login
2. Password Reset (if needed)
3. Profile Completion (if needed)
4. Logout
This ensures password reset happens before logout, preventing blockers.
"""
import pytest
from pages.login_page import LoginPage
from pages.mandatory_reset_page import MandatoryResetPage
from pages.profile_incomplete_page import ProfileIncompletePage
from pages.dashboard_page import DashboardPage
from config.config import TEST_USERNAME, TEST_PASSWORD, TEST_NEW_PASSWORD
@pytest.mark.authentication
@pytest.mark.integration
class TestCompleteStudentFlow:
"""Test cases for complete student flow in correct sequence"""
def test_complete_flow_with_password_reset(self, driver):
"""
Complete flow: Login → Password Reset → Dashboard → Logout
This test ensures password reset happens first, preventing
mandatory reset popup from blocking logout.
"""
# Step 1: Login (use tracked password if available)
from utils.password_tracker import password_tracker
password = password_tracker.get_password(TEST_USERNAME, TEST_PASSWORD)
login_page = LoginPage(driver)
login_page.login(identifier=TEST_USERNAME, password=password)
# Step 2: Handle Password Reset (if needed)
reset_page = MandatoryResetPage(driver)
if reset_page.is_modal_present():
print("✅ Password reset modal detected - resetting password")
# CRITICAL: Get current password from tracker (not hardcoded TEST_PASSWORD)
current_password = password_tracker.get_password(TEST_USERNAME, TEST_PASSWORD)
print(f"🔐 Using current password from tracker: {current_password[:3]}...")
# CRITICAL: Always reset to TEST_NEW_PASSWORD (not TEST_PASSWORD)
reset_page.reset_password(
current_password=current_password,
new_password=TEST_NEW_PASSWORD, # ✅ Always use TEST_NEW_PASSWORD
confirm_password=TEST_NEW_PASSWORD,
student_cpid=TEST_USERNAME
)
print("✅ Password reset completed")
# Password tracker is updated automatically by reset_password method
else:
print("✅ Password already reset - proceeding")
# Step 3: Verify on Dashboard (or profile builder if modal was handled)
dashboard_page = DashboardPage(driver)
current_url = driver.current_url
assert "/dashboard" in current_url or "/profile-builder" in current_url or "/student" in current_url, \
f"Should be on dashboard or profile builder after login/password reset. Current URL: {current_url}"
print("✅ Successfully on dashboard/profile builder")
# Step 4: Handle Profile Incomplete Modal (if present)
profile_incomplete = ProfileIncompletePage(driver)
if profile_incomplete.is_modal_present():
print("⚠️ Profile incomplete modal present - skipping logout test")
print(" (Profile must be completed before logout can be tested)")
pytest.skip("Profile incomplete - cannot test logout")
# Step 5: Logout (only if profile is complete)
# Note: Logout functionality needs to be implemented
# For now, we just verify we're on dashboard
print("✅ Complete flow test passed")
def test_login_password_reset_sequence(self, driver):
"""
Test that password reset happens before any other operations
This ensures the mandatory reset popup doesn't block other tests.
"""
# Login (use tracked password if available)
from utils.password_tracker import password_tracker
password = password_tracker.get_password(TEST_USERNAME, TEST_PASSWORD)
login_page = LoginPage(driver)
login_page.login(identifier=TEST_USERNAME, password=password)
# Check for password reset immediately
reset_page = MandatoryResetPage(driver)
password_reset_required = reset_page.is_modal_present()
if password_reset_required:
# Reset password first (with CPID for tracking)
# CRITICAL: Get current password from tracker (not hardcoded TEST_PASSWORD)
current_password = password_tracker.get_password(TEST_USERNAME, TEST_PASSWORD)
print(f"🔐 Using current password from tracker: {current_password[:3]}...")
# CRITICAL: Always reset to TEST_NEW_PASSWORD (not TEST_PASSWORD)
reset_page.reset_password(
current_password=current_password,
new_password=TEST_NEW_PASSWORD, # ✅ Always use TEST_NEW_PASSWORD
confirm_password=TEST_NEW_PASSWORD,
student_cpid=TEST_USERNAME
)
print("✅ Password reset completed - student can now proceed")
else:
print("✅ Password already reset - student can proceed")
# Verify we can proceed (not blocked by reset modal)
assert not reset_page.is_modal_present(), \
"Password reset modal should be closed after reset"
# Verify on dashboard
assert "/dashboard" in driver.current_url or "/student" in driver.current_url, \
"Should be on dashboard after password reset"
print("✅ Password reset sequence test passed")