282 lines
12 KiB
Python
282 lines
12 KiB
Python
"""
|
|
Profile Filling Test Cases
|
|
|
|
Tests complete profile filling functionality for new students.
|
|
"""
|
|
import pytest
|
|
from pages.login_page import LoginPage
|
|
from pages.mandatory_reset_page import MandatoryResetPage
|
|
from pages.profile_incomplete_page import ProfileIncompletePage
|
|
from pages.profile_editor_page import ProfileEditorPage
|
|
from config.config import TEST_NEW_PASSWORD, BASE_URL
|
|
import time
|
|
|
|
|
|
class TestProfileFilling:
|
|
"""Test cases for profile filling functionality"""
|
|
|
|
def test_profile_incomplete_modal_appears(self, driver, new_student_credentials):
|
|
"""Test that profile incomplete modal appears for incomplete profiles"""
|
|
cpid, _ = new_student_credentials
|
|
|
|
# Login using smart login (handles password automatically)
|
|
login_page = LoginPage(driver)
|
|
login_page.login(identifier=cpid, password=None) # Smart login handles password
|
|
|
|
# Handle password reset if needed
|
|
reset_page = MandatoryResetPage(driver)
|
|
if reset_page.is_modal_present():
|
|
# Get current password from tracker or use Excel password
|
|
from utils.password_tracker import password_tracker
|
|
from config.config import TEST_PASSWORD
|
|
current_password = password_tracker.get_password(cpid, TEST_PASSWORD)
|
|
reset_page.reset_password(
|
|
current_password=current_password,
|
|
new_password=TEST_NEW_PASSWORD,
|
|
confirm_password=TEST_NEW_PASSWORD,
|
|
student_cpid=cpid
|
|
)
|
|
|
|
# Check for profile incomplete modal
|
|
profile_incomplete = ProfileIncompletePage(driver)
|
|
if profile_incomplete.is_modal_present():
|
|
progress = profile_incomplete.get_progress_value()
|
|
print(f"✅ Profile incomplete modal found - Progress: {progress}")
|
|
assert progress != "100%", "Profile should be incomplete"
|
|
else:
|
|
print("⚠️ Profile incomplete modal not found - profile may already be complete")
|
|
|
|
def test_navigate_to_profile_editor(self, driver, new_student_credentials):
|
|
"""Test navigation to profile editor from incomplete modal"""
|
|
cpid, _ = new_student_credentials
|
|
|
|
# Login using smart login (handles password automatically)
|
|
login_page = LoginPage(driver)
|
|
login_page.login(identifier=cpid, password=None) # Smart login handles password
|
|
|
|
reset_page = MandatoryResetPage(driver)
|
|
if reset_page.is_modal_present():
|
|
# Get current password from tracker or use Excel password
|
|
from utils.password_tracker import password_tracker
|
|
from config.config import TEST_PASSWORD
|
|
current_password = password_tracker.get_password(cpid, TEST_PASSWORD)
|
|
reset_page.reset_password(
|
|
current_password=current_password,
|
|
new_password=TEST_NEW_PASSWORD,
|
|
confirm_password=TEST_NEW_PASSWORD,
|
|
student_cpid=cpid
|
|
)
|
|
|
|
# Click complete profile button
|
|
profile_incomplete = ProfileIncompletePage(driver)
|
|
if profile_incomplete.is_modal_present():
|
|
profile_incomplete.click_complete()
|
|
|
|
# Verify navigation to profile editor
|
|
assert "/profile-builder" in driver.current_url, \
|
|
"Should navigate to profile editor"
|
|
print("✅ Successfully navigated to profile editor")
|
|
else:
|
|
pytest.skip("Profile incomplete modal not present")
|
|
|
|
def test_profile_editor_page_loads(self, driver, new_student_credentials):
|
|
"""Test that profile editor page loads correctly"""
|
|
cpid, _ = new_student_credentials
|
|
|
|
# Login using smart login (handles password automatically)
|
|
login_page = LoginPage(driver)
|
|
login_page.login(identifier=cpid, password=None) # Smart login handles password
|
|
|
|
reset_page = MandatoryResetPage(driver)
|
|
if reset_page.is_modal_present():
|
|
# Get current password from tracker or use Excel password
|
|
from utils.password_tracker import password_tracker
|
|
from config.config import TEST_PASSWORD
|
|
current_password = password_tracker.get_password(cpid, TEST_PASSWORD)
|
|
reset_page.reset_password(
|
|
current_password=current_password,
|
|
new_password=TEST_NEW_PASSWORD,
|
|
confirm_password=TEST_NEW_PASSWORD,
|
|
student_cpid=cpid
|
|
)
|
|
|
|
profile_incomplete = ProfileIncompletePage(driver)
|
|
if profile_incomplete.is_modal_present():
|
|
profile_incomplete.click_complete()
|
|
time.sleep(2) # Wait for navigation
|
|
|
|
# Navigate to profile editor
|
|
profile_editor = ProfileEditorPage(driver)
|
|
profile_editor.navigate() # Navigate first
|
|
profile_editor.wait_for_page_load() # Then wait for load
|
|
|
|
# Check for profile editor elements (PAGE might not have data-testid, so check for progress or tabs)
|
|
page_loaded = False
|
|
try:
|
|
page_loaded = profile_editor.is_element_visible(profile_editor.PAGE, timeout=3)
|
|
except:
|
|
pass
|
|
|
|
if not page_loaded:
|
|
# Fallback: check for progress value or tabs
|
|
try:
|
|
page_loaded = profile_editor.is_element_visible(profile_editor.PROGRESS_VALUE, timeout=3)
|
|
except:
|
|
try:
|
|
page_loaded = profile_editor.is_element_visible(profile_editor.TAB_PERSONAL_INFORMATION, timeout=3)
|
|
except:
|
|
pass
|
|
|
|
assert page_loaded or "/profile-builder" in driver.current_url, \
|
|
f"Profile editor page should be visible. URL: {driver.current_url}"
|
|
|
|
progress = profile_editor.get_progress_value()
|
|
print(f"✅ Profile editor loaded - Current progress: {progress}")
|
|
|
|
def test_profile_all_tabs_accessible(self, driver, new_student_credentials):
|
|
"""Test that all profile tabs are accessible"""
|
|
cpid, _ = new_student_credentials
|
|
|
|
# Login using smart login (handles password automatically)
|
|
login_page = LoginPage(driver)
|
|
login_page.login(identifier=cpid, password=None) # Smart login handles password
|
|
|
|
reset_page = MandatoryResetPage(driver)
|
|
if reset_page.is_modal_present():
|
|
# Get current password from tracker or use Excel password
|
|
from utils.password_tracker import password_tracker
|
|
from config.config import TEST_PASSWORD
|
|
current_password = password_tracker.get_password(cpid, TEST_PASSWORD)
|
|
reset_page.reset_password(
|
|
current_password=current_password,
|
|
new_password=TEST_NEW_PASSWORD,
|
|
confirm_password=TEST_NEW_PASSWORD,
|
|
student_cpid=cpid
|
|
)
|
|
|
|
profile_incomplete = ProfileIncompletePage(driver)
|
|
if profile_incomplete.is_modal_present():
|
|
profile_incomplete.click_complete()
|
|
time.sleep(2) # Wait for navigation
|
|
|
|
# Navigate to profile editor
|
|
profile_editor = ProfileEditorPage(driver)
|
|
profile_editor.navigate() # Navigate first
|
|
profile_editor.wait_for_page_load() # Then wait for load
|
|
|
|
# Test accessing each tab (CORRECT STRUCTURE: 8 tabs, 0-7)
|
|
# Note: Contact Information is merged into Personal Information tab
|
|
tabs = [
|
|
("Personal Information", profile_editor.TAB_PERSONAL_INFORMATION), # Tab 0 (includes Contact Info)
|
|
("Parent/Guardian Information", profile_editor.TAB_PARENT_GUARDIAN_INFORMATION), # Tab 1
|
|
("Institution Details", profile_editor.TAB_INSTITUTION_DETAILS), # Tab 2
|
|
("Focus Areas", profile_editor.TAB_FOCUS_AREAS), # Tab 3
|
|
("Self-Assessment", profile_editor.TAB_SELF_ASSESSMENT), # Tab 4
|
|
("Hobbies & Clubs", profile_editor.TAB_HOBBIES_CLUBS), # Tab 5
|
|
("Achievements", profile_editor.TAB_ACHIEVEMENTS), # Tab 6
|
|
("Expectations", profile_editor.TAB_EXPECTATIONS), # Tab 7
|
|
]
|
|
|
|
for i, (tab_name, tab_locator) in enumerate(tabs):
|
|
try:
|
|
profile_editor.navigate_to_tab(i)
|
|
time.sleep(0.5) # Wait for tab to load
|
|
print(f" ✅ Tab accessible: {tab_name} (Tab {i+1}/8)")
|
|
except Exception as e:
|
|
print(f" ⚠️ Tab not accessible: {tab_name} - {e}")
|
|
|
|
print("✅ All tabs accessibility test completed")
|
|
|
|
def test_profile_completion_with_data(self, driver, new_student_credentials):
|
|
"""
|
|
Test complete profile completion to 100% by filling all 8 tabs
|
|
|
|
NEW STRUCTURE (8 tabs - UI Dev Team Updated):
|
|
1. Personal Information (includes BOTH Personal Info AND Contact Information)
|
|
2. Parent/Guardian Information
|
|
3. Institution Details
|
|
4. Focus Areas
|
|
5. Self-Assessment
|
|
6. Hobbies & Clubs
|
|
7. Achievements
|
|
8. Expectations
|
|
|
|
This test:
|
|
1. Logs in and handles password reset/profile incomplete modals
|
|
2. Navigates through all 8 tabs (handling horizontal scroll)
|
|
3. Fills all required and important optional fields
|
|
4. Verifies progress reaches 100%
|
|
5. Saves successfully
|
|
"""
|
|
cpid, _ = new_student_credentials
|
|
|
|
# Login using smart login (handles password automatically)
|
|
login_page = LoginPage(driver)
|
|
login_page.login(identifier=cpid, password=None) # Smart login handles password
|
|
|
|
reset_page = MandatoryResetPage(driver)
|
|
if reset_page.is_modal_present():
|
|
# Get current password from tracker or use Excel password
|
|
from utils.password_tracker import password_tracker
|
|
from config.config import TEST_PASSWORD, TEST_NEW_PASSWORD
|
|
current_password = password_tracker.get_password(cpid, TEST_PASSWORD)
|
|
reset_page.reset_password(
|
|
current_password=current_password,
|
|
new_password=TEST_NEW_PASSWORD,
|
|
confirm_password=TEST_NEW_PASSWORD,
|
|
student_cpid=cpid
|
|
)
|
|
|
|
# Handle profile incomplete modal
|
|
profile_incomplete = ProfileIncompletePage(driver)
|
|
if profile_incomplete.is_modal_present():
|
|
profile_incomplete.click_complete()
|
|
time.sleep(2) # Wait for navigation after clicking complete
|
|
|
|
# Navigate to profile editor
|
|
profile_editor = ProfileEditorPage(driver)
|
|
profile_editor.navigate() # Navigate first
|
|
profile_editor.wait_for_page_load() # Then wait for load
|
|
|
|
# Get initial progress
|
|
initial_progress = profile_editor.get_progress_value()
|
|
print(f"📊 Initial profile progress: {initial_progress}")
|
|
|
|
# Complete profile to 100% using student data from CSV (prevents age verification modal)
|
|
# Pass student CPID to use correct DOB that matches school records
|
|
success = profile_editor.complete_profile_to_100(student_cpid=cpid)
|
|
|
|
# Verify progress reached 100%
|
|
final_progress = profile_editor.get_progress_value()
|
|
print(f"📊 Final profile progress: {final_progress}")
|
|
|
|
assert "100%" in final_progress or final_progress == "100", \
|
|
f"Profile should be 100% complete. Current: {final_progress}"
|
|
assert success, "Profile completion method should return True"
|
|
|
|
print("✅ Profile completed to 100% successfully!")
|
|
|
|
|
|
@pytest.fixture
|
|
def new_student_credentials():
|
|
"""Fixture providing new student credentials from config"""
|
|
from config.config import TEST_USERNAME, TEST_PASSWORD
|
|
return (TEST_USERNAME, TEST_PASSWORD)
|
|
|
|
|
|
@pytest.fixture
|
|
def new_student_with_data():
|
|
"""Fixture providing new student with complete data"""
|
|
# TODO: Get from Excel file with all profile data
|
|
student_data = {
|
|
"first_name": "Test",
|
|
"last_name": "Student",
|
|
"gender": "Male",
|
|
"dob": "2000-01-01",
|
|
"language": "English",
|
|
"student_id": "1234567890",
|
|
|
|
}
|
|
return ("NEW_STUDENT_CPID", "DEFAULT_PASSWORD", student_data)
|
|
|