CP_AUTOMATION/scripts/test_complete_student_journey.py
2025-12-12 19:54:54 +05:30

324 lines
13 KiB
Python

#!/usr/bin/env python3
"""
Complete Student Journey Test
Systematic end-to-end test covering the entire student flow:
1. Login
2. Password Reset (if new student) → Admin@123
3. Profile Completion (if not 100%)
4. Start Assessment
5. Complete All Domains/Phases
6. Provide All Feedbacks
7. Complete Assessment
This is a comprehensive, systematic test following best practices.
"""
import sys
import time
import pytest
from pathlib import Path
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
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 pages.student_nav_page import StudentNavPage
from pages.assessments_page import AssessmentsPage
from pages.domains_page import DomainsPage
from pages.domain_assessment_page import DomainAssessmentPage
from pages.domain_feedback_page import DomainFeedbackPage
from pages.feedback_survey_page import FeedbackSurveyPage
from utils.driver_manager import DriverManager
from config.config import BASE_URL, TEST_NEW_PASSWORD
class TestCompleteStudentJourney:
"""Complete systematic test for student journey"""
@pytest.fixture(scope="class")
def driver(self):
"""Setup WebDriver"""
driver_manager = DriverManager()
driver = driver_manager.get_driver(headless=False) # Visible for debugging
yield driver
driver.quit()
def test_complete_journey(self, driver, student_cpid, student_password):
"""
Complete student journey test
Args:
driver: WebDriver instance
student_cpid: Student CPID
student_password: Student password
"""
print(f"\n{'='*80}")
print(f"COMPLETE STUDENT JOURNEY TEST")
print(f"{'='*80}")
print(f"Student: {student_cpid}")
print(f"{'='*80}\n")
# STEP 1: LOGIN
print("[STEP 1] LOGIN")
print("-" * 80)
login_page = LoginPage(driver)
login_page.login(identifier=student_cpid, password=student_password)
time.sleep(2)
print(f"✅ Login successful - URL: {driver.current_url}\n")
# STEP 2: PASSWORD RESET (if new student)
print("[STEP 2] PASSWORD RESET CHECK")
print("-" * 80)
reset_page = MandatoryResetPage(driver)
if reset_page.is_modal_present():
print(" ✅ Password reset modal found (new student)")
print(f" Resetting password to: {TEST_NEW_PASSWORD}")
reset_page.reset_password(
current_password=student_password,
new_password=TEST_NEW_PASSWORD,
confirm_password=TEST_NEW_PASSWORD
)
print(" ✅ Password reset completed")
student_password = TEST_NEW_PASSWORD # Update for future use
else:
print(" ✅ No password reset required (existing student)")
print()
# STEP 3: PROFILE COMPLETION (if not 100%)
print("[STEP 3] PROFILE COMPLETION CHECK")
print("-" * 80)
profile_incomplete = ProfileIncompletePage(driver)
if profile_incomplete.is_modal_present():
progress = profile_incomplete.get_progress_value()
print(f" Profile incomplete - Current Progress: {progress}")
print(" Clicking Complete Profile button...")
profile_incomplete.click_complete()
time.sleep(3)
print(f" Navigated to: {driver.current_url}")
# Complete profile to 100%
print("\n [STEP 3.1] Completing Profile to 100%...")
profile_editor = ProfileEditorPage(driver)
profile_editor.wait_for_page_load()
# TODO: Fill profile with student data
# For now, we'll note that profile completion automation needs student data
print(" ⚠️ Profile completion automation requires student data")
print(" Note: Profile can be completed manually or with data from Excel")
# Check progress
progress = profile_editor.get_progress_value()
print(f" Current Profile Progress: {progress}")
if "100%" in progress:
print(" ✅ Profile is 100% complete!")
else:
print(f" ⚠️ Profile is {progress} complete - needs completion")
else:
print(" ✅ Profile already complete or modal not present")
print()
# STEP 4: NAVIGATE TO ASSESSMENTS
print("[STEP 4] NAVIGATE TO ASSESSMENTS")
print("-" * 80)
nav = StudentNavPage(driver)
nav.click_assessments()
time.sleep(2)
print(f"✅ Navigated to Assessments - URL: {driver.current_url}\n")
# STEP 5: START ASSESSMENT
print("[STEP 5] START ASSESSMENT")
print("-" * 80)
assessments_page = AssessmentsPage(driver)
assessments_page.wait_for_page_load()
# Get available assessments
assessments = assessments_page.get_available_assessments()
print(f" Found {len(assessments)} assessment(s)")
if not assessments:
print(" ⚠️ No assessments available")
return
# Start first available assessment
first_assessment_id = assessments[0]
print(f" Starting assessment ID: {first_assessment_id}")
assessments_page.click_begin_assessment(first_assessment_id)
time.sleep(3)
print(f"✅ Assessment started - URL: {driver.current_url}\n")
# STEP 6: COMPLETE ALL DOMAINS
print("[STEP 6] COMPLETE ALL DOMAINS")
print("-" * 80)
domains_page = DomainsPage(driver)
domains_page.wait_for_page_load()
# Get all domains
domains = domains_page.get_available_domains()
print(f" Found {len(domains)} domain(s)")
for idx, domain_id in enumerate(domains, 1):
print(f"\n [DOMAIN {idx}/{len(domains)}] Domain ID: {domain_id}")
print(" " + "-" * 76)
# Check if domain is unlocked
if not domains_page.is_domain_unlocked(domain_id):
print(f" ⚠️ Domain {domain_id} is locked - skipping")
continue
# Start domain assessment
print(f" Starting domain assessment...")
domains_page.click_start_domain(domain_id)
time.sleep(3)
# STEP 6.1: COMPLETE DOMAIN ASSESSMENT
print(f" [STEP 6.1] Completing Domain Assessment...")
domain_assessment = DomainAssessmentPage(driver)
domain_assessment.wait_for_page_load()
# Get all questions in this domain
questions = domain_assessment.get_all_questions()
print(f" Found {len(questions)} question(s) in this domain")
# Answer all questions
for q_idx, question_id in enumerate(questions, 1):
print(f" [Q{q_idx}/{len(questions)}] Answering question {question_id}...")
# Get question type and answer accordingly
question_type = domain_assessment.get_question_type(question_id)
print(f" Question type: {question_type}")
# Answer based on type
if question_type == "multiple_choice":
# Select first option
options = domain_assessment.get_question_options(question_id)
if options:
domain_assessment.select_option(question_id, options[0])
print(f" Selected option: {options[0]}")
elif question_type == "true_false":
# Select True
domain_assessment.select_true_false(question_id, True)
print(f" Selected: True")
elif question_type == "rating":
# Select middle rating (3 out of 5)
domain_assessment.select_rating(question_id, 3)
print(f" Selected rating: 3")
elif question_type == "open_ended":
# Enter sample text
domain_assessment.enter_open_ended(question_id, "Sample response for automation testing")
print(f" Entered text response")
elif question_type == "matrix":
# Fill matrix cells
rows, cols = domain_assessment.get_matrix_dimensions(question_id)
for r in range(min(rows, 3)): # Fill first 3 rows
for c in range(min(cols, 3)): # Fill first 3 cols
domain_assessment.select_matrix_cell(question_id, r, c, True)
print(f" Filled matrix cells")
time.sleep(0.5) # Small delay between questions
# Submit domain assessment
print(f" Submitting domain assessment...")
domain_assessment.click_submit()
time.sleep(2)
# Handle submit confirmation modal if present
if domain_assessment.is_submit_modal_present():
domain_assessment.confirm_submit()
time.sleep(2)
# Wait for success modal
if domain_assessment.is_success_modal_present():
print(f" ✅ Domain assessment submitted successfully")
domain_assessment.close_success_modal()
time.sleep(2)
# STEP 6.2: PROVIDE DOMAIN FEEDBACK
print(f" [STEP 6.2] Providing Domain Feedback...")
domain_feedback = DomainFeedbackPage(driver)
if domain_feedback.is_modal_present():
print(f" Domain feedback modal found")
# Answer feedback questions
# Question 1: Yes/No
if domain_feedback.has_question1_yes_no():
domain_feedback.select_question1_yes()
print(f" Selected: Yes for question 1")
# Question 1: Reason (if Yes selected)
if domain_feedback.has_question1_reason():
domain_feedback.enter_question1_reason("Automated feedback response")
print(f" Entered reason")
# Question 2: Textarea
if domain_feedback.has_question2_textarea():
domain_feedback.enter_question2_text("This is automated feedback for testing purposes.")
print(f" Entered feedback text")
# Submit feedback
domain_feedback.click_submit()
time.sleep(2)
print(f" ✅ Domain feedback submitted")
else:
print(f" ⚠️ No domain feedback modal found")
# Navigate back to domains page
print(f" Returning to domains page...")
driver.back()
time.sleep(2)
domains_page = DomainsPage(driver)
domains_page.wait_for_page_load()
print(f"\n✅ All domains completed!\n")
# STEP 7: FINAL FEEDBACK
print("[STEP 7] FINAL FEEDBACK")
print("-" * 80)
# Check if final feedback modal is available
feedback_survey = FeedbackSurveyPage(driver)
if feedback_survey.is_final_feedback_available():
print(" Final feedback modal found")
# Provide overall rating
feedback_survey.select_overall_rating(4) # 4 out of 5
print(" Selected overall rating: 4")
# Answer per-question feedback if present
questions = feedback_survey.get_feedback_questions()
for q_id in questions:
feedback_survey.select_question_rating(q_id, 4)
feedback_survey.enter_question_comment(q_id, "Automated feedback comment")
print(f" Provided feedback for question {q_id}")
# Submit final feedback
feedback_survey.click_submit()
time.sleep(2)
print(" ✅ Final feedback submitted")
else:
print(" ⚠️ Final feedback modal not available")
print(f"\n{'='*80}")
print("COMPLETE JOURNEY TEST FINISHED SUCCESSFULLY!")
print(f"{'='*80}\n")
# Keep browser open for inspection
print("Keeping browser open for 60 seconds for inspection...")
time.sleep(60)
@pytest.mark.parametrize("student_cpid,student_password", [
("BARBAR110A", "48Rx98pCco*A"),
# Add more students here as needed
])
def test_student_journey(driver, student_cpid, student_password):
"""Parametrized test for multiple students"""
test_instance = TestCompleteStudentJourney()
test_instance.test_complete_journey(driver, student_cpid, student_password)