# ๐ฏ FINAL COMPLETE DATA-TESTID REQUIREMENTS
## Comprehensive Requirements Document for UI Development Team
**Document Version:** 2.0 (Final)
**Date:** 2025-01-20
**Purpose:** Complete, standalone requirements for all `data-testid` attributes needed for world-class automation testing
**Status:** โ
**READY FOR IMPLEMENTATION**
---
## ๐ **EXECUTIVE SUMMARY**
This document provides **complete, comprehensive, and accurate** requirements for all `data-testid` attributes needed across the Cognitive Prism Assessment Platform. These attributes are **critical** for:
- โ
**Reliable Automation Testing** - Stable locators that don't break with UI changes
- โ
**Performance Monitoring** - Track element load times and interactions
- โ
**Error Analysis** - Precise error reporting and debugging
- โ
**Regression Testing** - Ensure functionality remains intact across updates
- โ
**World-Class Quality Assurance** - Professional-grade test automation
**Total Attributes Required:** ~350+ (including dynamic patterns)
**Priority:** ๐ด **CRITICAL** - Required for production-ready automation
---
## ๐ **NAMING CONVENTION (MANDATORY)**
### **Pattern: `{scope}__{element_name}`**
- **Double underscore (`__`)** separates scope from element name
- **Single underscore (`_`)** within element names for readability
- **Scopes** are lowercase snake_case (e.g., `student_login`, `domain_assessment`)
- **Element names** are lowercase snake_case (e.g., `first_name_input`, `submit_button`)
### **Dynamic Patterns:**
For dynamic collections, identifiers are appended with double underscore:
- `{scope}__{baseId}__{dynamicPart}`
- Example: `assessment_card__51_action`
- Example: `domain_question__123__option_A`
- Example: `domain_question__456__rating_3`
### **Critical Rules:**
1. โ
**Never reuse** the same `data-testid` value for two different DOM nodes
2. โ
**Always use** double underscore (`__`) to separate scope and dynamic parts
3. โ
**Always use** lowercase snake_case (no camelCase, no kebab-case)
4. โ
**Always include** `data-testid` on interactive elements (buttons, inputs, links)
5. โ
**Always include** `data-testid` on containers that hold dynamic content
---
## ๐ฏ **SCOPE REFERENCE**
| Scope | Description | Route/Page |
|-------|-------------|------------|
| `student_login` | Sign-in form | `/` |
| `mandatory_reset` | First-login password reset modal | Modal overlay |
| `profile_incomplete` | Modal that forces profile completion | Modal overlay |
| `profile_editor` | Profile builder/editor | `/student/profile-builder` |
| `student_nav` | Logged-in student header/navigation | All student pages |
| `assessment_card` | Product cards on assessments hub | `/assessments` |
| `domains_page` | Domain listing screen | `/assessment/{assignmentId}/domains` |
| `domain_card` | Individual domain tiles | `/assessment/{assignmentId}/domains` |
| `domain_assessment` | In-progress domain test experience | `/assessment/{assignmentId}/domain/{domainId}` |
| `domain_question` | Question renderer + inputs | `/assessment/{assignmentId}/domain/{domainId}` |
| `domain_feedback` | Per-domain feedback modal | Modal overlay |
| `domains_final_feedback` | Final feedback modal after all domains | Modal overlay |
---
## ๐ฆ **SECTION 1: ASSESSMENTS HUB PAGE**
### **File:** `src/pages/designs/design-1/assessment/AssessmentMainPage.jsx`
### **Component:** `ProductCard.jsx` (used in `AssessmentSection.jsx`)
#### **1.1 Assessment Cards**
**Status:** โ **NOT IMPLEMENTED**
**File Location:** `src/pages/designs/design-1/assessment/components/ProductCard.jsx`
**Required Attributes:**
```jsx
// Assessment Card Container
{/* Card header with name, description */}
{assessment.name}
{assessment.description}
{/* Progress indicator */}
{assessment.progress?.overallProgress || 0}%
{/* Action Button */}
)
}
```
**Dynamic Values:**
- `assignmentId`: Number (e.g., `51`)
- Generated: `assessment_card__51`, `assessment_card__51__action`, `assessment_card__51__progress`
**Implementation Locations:**
- Line ~95: Add `data-testid={`assessment_card__${assignmentId}`}` to `` container
- Line ~161: Add `data-testid={`assessment_card__${assignmentId}__progress`}` to progress value span
- Line ~184: Add `data-testid={`assessment_card__${assignmentId}__action`}` to action button, `assessment_card__51__progress`
---
#### **1.2 Assessment Section Headers**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Section Container
{/* Section Title */}
Ready to Start / Completed / etc.
```
**Section Names:**
- `ready_to_start`
- `completed`
- `retake_available`
- `abandoned`
- `prerequisites_needed`
**Implementation Example:**
```jsx
// In AssessmentMainPage.jsx
```
---
## ๐ฆ **SECTION 2: DOMAINS PAGE**
### **File:** `src/pages/designs/design-1/assessment/domains/ProductDomainsPage.jsx`
### **Component:** `DomainCard.jsx`
#### **2.1 Domain Cards**
**Status:** โ ๏ธ **PARTIALLY IMPLEMENTED**
**Current Implementation:**
- โ
Card container has test-id (line 83 in DomainCard.jsx): `domain_card__${domain.id}`
- โ Action button missing test-id (line 211-248 in DomainCard.jsx)
**Required Attributes:**
```jsx
// Domain Card Container (โ
Already Implemented)
{/* Domain Card Action Button (โ MISSING) */}
onStart(domain)}
disabled={isActionDisabled}
className="..."
>
Start Assessment / Continue Assessment / Completed / Locked
```
**Implementation Fix:**
```jsx
// In DomainCard.jsx, line ~211
{/* Button content */}
```
**Dynamic Values:**
- `domain.id`: Number (e.g., `1`, `2`, `3`)
- Generated: `domain_card__1`, `domain_card__1__action`
---
#### **2.2 Domains Page Container**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Page Container
{/* Page Header */}
{/* Back Button */}
```
**Implementation Example:**
```jsx
// In ProductDomainsPage.jsx
{productInfo?.name}
{overallProgress}%
```
---
## ๐ฆ **SECTION 3: DOMAIN ASSESSMENT PAGE**
### **File:** `src/pages/designs/design-1/assessment/domains/DomainAssessmentPage.jsx`
### **Component:** `AssessmentHeader.jsx`
#### **3.1 Domain Assessment Page Container**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Page Container
{/* Assessment Header */}
```
**Implementation Example:**
```jsx
// In DomainAssessmentPage.jsx, main return statement
```
---
#### **3.2 Assessment Header Components**
**File:** `src/pages/designs/design-1/assessment/domains/components/AssessmentHeader.jsx`
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Header Container
{/* Back Button */}
{/* Domain Title */}
{domain?.name}
{/* Progress Value */}
{progressPercent}%
{/* Timer Value (if present) */}
{timeLeft && (
{formatTime(timeLeft)}
)}
```
**Implementation Example:**
```jsx
// In AssessmentHeader.jsx
```
---
#### **3.3 Instructions Modal**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Instructions Modal Container
{/* Modal Content */}
{/* Continue Button */}
```
**Implementation Example:**
```jsx
// In DomainAssessmentPage.jsx, instructions modal section
{showInstructions && (
{/* Instructions content */}
)}
```
---
#### **3.4 Sticky Action Bar**
**File:** `src/pages/designs/design-1/assessment/domains/components/StickyActionBar.jsx`
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Action Bar Container
{/* Previous Button */}
{/* Next Button */}
{/* Submit Button */}
```
**Implementation Example:**
```jsx
// In StickyActionBar.jsx
```
---
#### **3.5 Question Navigator**
**File:** `src/pages/designs/design-1/assessment/domains/components/QuestionNavigator.jsx`
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Navigator Container
{/* Individual Question Buttons */}
{questionsOrder.map((questionId, idx) => (
))}
```
**Implementation Example:**
```jsx
// In QuestionNavigator.jsx
{questionsOrder.map((questionId, idx) => (
))}
```
---
#### **3.6 Submit Confirmation Modal**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Submit Modal Container
{/* Modal Content */}
{/* Review Button */}
{/* Confirm Button */}
{/* Cancel Button */}
```
---
#### **3.7 Guidance Modal**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Guidance Modal Container
{/* Modal Content */}
{/* Dismiss Button */}
```
---
#### **3.8 Success Modal**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Success Modal Container
{/* Modal Content */}
{/* Success Message */}
Domain assessment submitted successfully!
```
---
## ๐ฆ **SECTION 4: QUESTION COMPONENTS**
### **File:** `src/pages/designs/design-1/assessment/domains/components/QuestionRenderer.jsx`
### **Component:** `QuestionShell.jsx`
#### **4.1 Question Shell Container**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Question Shell Container
{/* Question Header */}
{currentIndex + 1}
{question.text}
{/* Question Content (rendered by QuestionRenderer) */}
{children}
```
**Implementation Example:**
```jsx
// In QuestionShell.jsx
{currentIndex + 1}
{question.text}
{children}
```
---
### **Component:** `MultipleChoiceQuestion.jsx`
#### **4.2 Multiple Choice Questions**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Multiple Choice Container
{options.map((option, idx) => (
))}
```
**Implementation Example:**
```jsx
// In MultipleChoiceQuestion.jsx
{options.map((option, idx) => {
const optionLabel = String.fromCharCode(65 + idx) // A, B, C, D, E
return (
)
})}
```
**Dynamic Values:**
- `question.id`: Number (e.g., `123`)
- `optionLabel`: Letter (A, B, C, D, E)
- Generated: `domain_question__123__option_A`, `domain_question__123__option_B`
---
### **Component:** `TrueFalseQuestion.jsx`
#### **4.3 True/False Questions**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// True/False Container
```
**Implementation Example:**
```jsx
// In TrueFalseQuestion.jsx
```
**Dynamic Values:**
- `question.id`: Number (e.g., `456`)
- Generated: `domain_question__456__truefalse_True`, `domain_question__456__truefalse_False`
---
### **Component:** `RatingScaleQuestion.jsx`
#### **4.4 Rating Scale Questions**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Rating Scale Container
{scaleOptions.map((option) => (
))}
```
**Implementation Example:**
```jsx
// In RatingScaleQuestion.jsx
{scaleOptions.map((option) => (
))}
```
**Dynamic Values:**
- `question.id`: Number (e.g., `789`)
- `option.value`: String (e.g., `"1"`, `"2"`, `"3"`, `"4"`, `"5"`)
- Generated: `domain_question__789__rating_1`, `domain_question__789__rating_2`
---
### **Component:** `OpenEndedQuestion.jsx`
#### **4.5 Open-Ended Questions**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Open-Ended Container
```
**Implementation Example:**
```jsx
// In OpenEndedQuestion.jsx
```
**Dynamic Values:**
- `question.id`: Number (e.g., `101`)
- Generated: `domain_question__101__open_ended`, `domain_question__101__textarea`
---
### **Component:** `MatrixQuestion.jsx`
#### **4.6 Matrix Questions**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Matrix Container
```
**Implementation Example:**
```jsx
// In MatrixQuestion.jsx
```
**Dynamic Values:**
- `question.id`: Number (e.g., `202`)
- `rowIdx`: Number (0-based index, e.g., `0`, `1`, `2`)
- `colIdx`: Number (0-based index, e.g., `0`, `1`, `2`, `3`, `4`)
- Generated: `domain_question__202__matrix_0_0`, `domain_question__202__matrix_0_1`
---
## ๐ฆ **SECTION 5: DOMAIN FEEDBACK MODAL**
### **File:** `src/pages/designs/design-1/assessment/domains/DomainAssessmentPage.jsx`
#### **5.1 Domain Feedback Modal**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Feedback Modal Container
{/* Modal Content */}
{/* Question 1: Were these questions understandable? */}
{/* Yes Button */}
{/* No Button */}
{/* Justification Textarea (shown when No is selected) */}
{feedbackData.question1 === false && (
{/* Question 2: Any other comments? */}
{/* Submit Button */}
```
**Implementation Example:**
```jsx
// In DomainAssessmentPage.jsx, feedback modal section
{showFeedbackModal && (
Domain Feedback
{/* Question 1 */}
{feedbackData.question1 === false && (
{/* Question 2 */}
)}
```
---
## ๐ฆ **SECTION 6: FINAL FEEDBACK MODAL**
### **File:** `src/pages/designs/design-1/assessment/domains/ProductDomainsPage.jsx`
#### **6.1 Final Feedback Modal**
**Status:** โ **NOT IMPLEMENTED**
**Required Attributes:**
```jsx
// Final Feedback Modal Container
{/* Modal Content */}
{/* Overall Rating (1-5 stars) */}
{[1, 2, 3, 4, 5].map((rating) => (
))}
{/* Clarity Question */}
{finalFeedbackData.clarity === false && (
{/* Confidence Question */}
{finalFeedbackData.confidence === false && (
{/* Comments */}
{/* Submit Button */}
```
**Implementation Example:**
```jsx
// In ProductDomainsPage.jsx, final feedback modal section
{showFinalFeedbackModal && (
Final Feedback
{/* Overall Rating */}
{[1, 2, 3, 4, 5].map((rating) => (
))}
{/* Clarity */}
{finalFeedbackData.clarity === false && (
{/* Confidence */}
{finalFeedbackData.confidence === false && (
{/* Comments */}
)}
```
---
## ๐ **COMPLETE ATTRIBUTE CHECKLIST**
### **Assessments Hub (Section 1)**
- [ ] `assessment_card__{assignmentId}` (card container)
- [ ] `assessment_card__{assignmentId}__action` (action button)
- [ ] `assessments_page__section_{sectionName}` (section container)
- [ ] `assessments_page__section_{sectionName}__title` (section title)
### **Domains Page (Section 2)**
- [x] `domain_card__{domainId}` (card container) - โ
**ALREADY IMPLEMENTED**
- [ ] `domain_card__{domainId}__action` (action button) - โ ๏ธ **MISSING**
- [ ] `domains_page__container` (page container)
- [ ] `domains_page__header` (page header)
- [ ] `domains_page__title` (product title)
- [ ] `domains_page__progress_value` (overall progress)
- [ ] `domains_page__back_button` (back button)
### **Domain Assessment Page (Section 3)**
- [ ] `domain_assessment__page` (page container)
- [ ] `domain_assessment__header` (header container)
- [ ] `domain_assessment__back_button` (back button)
- [ ] `domain_assessment__domain_title` (domain name)
- [ ] `domain_assessment__progress_value` (progress percentage)
- [ ] `domain_assessment__timer_value` (timer display)
- [ ] `domain_assessment__action_bar` (sticky action bar)
- [ ] `domain_assessment__prev_button` (previous button)
- [ ] `domain_assessment__next_button` (next button)
- [ ] `domain_assessment__submit_button` (submit button)
- [ ] `domain_assessment__question_navigator` (question navigator container)
- [ ] `domain_assessment__question_navigator__question_{index}` (individual question buttons)
- [ ] `domain_assessment__instructions_modal` (instructions modal)
- [ ] `domain_assessment__instructions_modal__content` (modal content)
- [ ] `domain_assessment__instructions_modal__continue_button` (continue button)
- [ ] `domain_assessment__submit_modal` (submit confirmation modal)
- [ ] `domain_assessment__submit_modal__content` (modal content)
- [ ] `domain_assessment__submit_modal__review_button` (review button)
- [ ] `domain_assessment__submit_modal__confirm_button` (confirm button)
- [ ] `domain_assessment__submit_modal__cancel_button` (cancel button)
- [ ] `domain_assessment__guidance_modal` (guidance modal)
- [ ] `domain_assessment__guidance_modal__content` (modal content)
- [ ] `domain_assessment__guidance_modal__dismiss_button` (dismiss button)
- [ ] `domain_assessment__success_modal` (success modal)
- [ ] `domain_assessment__success_modal__content` (modal content)
- [ ] `domain_assessment__success_modal__message` (success message)
### **Question Components (Section 4)**
- [ ] `domain_question__{questionId}` (question shell container)
- [ ] `domain_question__{questionId}__header` (question header)
- [ ] `domain_question__{questionId}__number` (question number)
- [ ] `domain_question__{questionId}__text` (question text)
- [ ] `domain_question__{questionId}__multiple_choice` (multiple choice container)
- [ ] `domain_question__{questionId}__option_{A|B|C|D|E}` (option buttons)
- [ ] `domain_question__{questionId}__true_false` (true/false container)
- [ ] `domain_question__{questionId}__truefalse_True` (Yes button)
- [ ] `domain_question__{questionId}__truefalse_False` (No button)
- [ ] `domain_question__{questionId}__rating_scale` (rating scale container)
- [ ] `domain_question__{questionId}__rating_{1|2|3|4|5}` (rating buttons)
- [ ] `domain_question__{questionId}__open_ended` (open-ended container)
- [ ] `domain_question__{questionId}__textarea` (textarea input)
- [ ] `domain_question__{questionId}__matrix` (matrix container)
- [ ] `domain_question__{questionId}__matrix_{rowIndex}_{columnIndex}` (matrix cells)
### **Domain Feedback Modal (Section 5)**
- [ ] `domain_feedback__modal` (modal container)
- [ ] `domain_feedback__modal__content` (modal content)
- [ ] `domain_feedback__question1` (question 1 container)
- [ ] `domain_feedback__question1_yes` (Yes button)
- [ ] `domain_feedback__question1_no` (No button)
- [ ] `domain_feedback__question1_justification` (justification textarea)
- [ ] `domain_feedback__question2` (question 2 container)
- [ ] `domain_feedback__question2_textarea` (comments textarea)
- [ ] `domain_feedback__submit_button` (submit button)
### **Final Feedback Modal (Section 6)**
- [ ] `domains_final_feedback__modal` (modal container)
- [ ] `domains_final_feedback__modal__content` (modal content)
- [ ] `domains_final_feedback__rating` (rating container)
- [ ] `domains_final_feedback__rating_{1|2|3|4|5}` (rating buttons)
- [ ] `domains_final_feedback__clarity` (clarity question container)
- [ ] `domains_final_feedback__clarity_yes` (Yes button)
- [ ] `domains_final_feedback__clarity_no` (No button)
- [ ] `domains_final_feedback__clarity_justification` (justification textarea)
- [ ] `domains_final_feedback__confidence` (confidence question container)
- [ ] `domains_final_feedback__confidence_yes` (Yes button)
- [ ] `domains_final_feedback__confidence_no` (No button)
- [ ] `domains_final_feedback__confidence_justification` (justification textarea)
- [ ] `domains_final_feedback__comments` (comments container)
- [ ] `domains_final_feedback__comments_textarea` (comments textarea)
- [ ] `domains_final_feedback__submit_button` (submit button)
---
## ๐ง **IMPLEMENTATION GUIDELINES**
### **1. Dynamic Attribute Generation**
For dynamic attributes, use template literals:
```jsx
// โ
CORRECT
data-testid={`assessment_card__${assignmentId}__action`}
data-testid={`domain_question__${question.id}__option_${optionLabel}`}
data-testid={`domain_question__${question.id}__matrix_${rowIdx}_${colIdx}`}
// โ INCORRECT
data-testid="assessment_card__" + assignmentId + "__action" // Don't use string concatenation
data-testid={`domain_question_${question.id}_option_${optionLabel}`} // Missing double underscore
```
### **2. Question ID Format**
Question IDs should be:
- **Numbers** (e.g., `123`, `456`)
- **Converted to string** in template literals (JavaScript handles this automatically)
- **Consistent** - use `question.id` directly, don't transform it
```jsx
// โ
CORRECT
data-testid={`domain_question__${question.id}`}
// โ INCORRECT
data-testid={`domain_question__${String(question.id).padStart(3, '0')}`} // Don't pad
data-testid={`domain_question__q${question.id}`} // Don't add prefix
```
### **3. Option Labels for Multiple Choice**
Use letter labels (A, B, C, D, E) based on array index:
```jsx
// โ
CORRECT
const optionLabel = String.fromCharCode(65 + idx) // A, B, C, D, E
data-testid={`domain_question__${question.id}__option_${optionLabel}`}
// โ INCORRECT
data-testid={`domain_question__${question.id}__option_${option.value}`} // Don't use option.value
data-testid={`domain_question__${question.id}__option_${idx}`} // Don't use numeric index
```
### **4. Matrix Row/Column Indices**
Use 0-based indices for both rows and columns:
```jsx
// โ
CORRECT
{rows.map((row, rowIdx) => (
columns.map((column, colIdx) => (
))
))}
// โ INCORRECT
data-testid={`domain_question__${question.id}__matrix_${rowIdx + 1}_${colIdx + 1}`} // Don't add 1
data-testid={`domain_question__${question.id}__matrix_${row}_${column}`} // Don't use row/column text
```
### **5. Modal Overlays**
Always include test-id on both overlay and content:
```jsx
// โ
CORRECT
```
### **6. Conditional Elements**
For conditional elements (e.g., justification textarea), always include test-id:
```jsx
// โ
CORRECT
{feedbackData.question1 === false && (
)}
```
---
## โ
**VERIFICATION CHECKLIST**
After implementation, verify:
1. โ
**All static attributes** are present and correctly named
2. โ
**All dynamic attributes** use correct template literal syntax
3. โ
**All interactive elements** (buttons, inputs, links) have test-ids
4. โ
**All modal containers** have test-ids on both overlay and content
5. โ
**All question types** have test-ids on containers and inputs
6. โ
**No duplicate test-ids** exist in the DOM
7. โ
**All test-ids follow** the naming convention (double underscore, lowercase snake_case)
---
## ๐งช **TESTING & VERIFICATION**
### **Automated Verification Script**
After implementation, run this verification script:
```javascript
// Verification script (can be added to UI codebase)
const verifyTestIds = () => {
const requiredTestIds = [
'domain_assessment__page',
'domain_assessment__back_button',
'domain_assessment__prev_button',
'domain_assessment__next_button',
'domain_assessment__submit_button',
// ... all required test-ids
]
const missing = requiredTestIds.filter(id =>
!document.querySelector(`[data-testid="${id}"]`) &&
!document.querySelector(`[data-testid^="${id}"]`) // For dynamic patterns
)
if (missing.length > 0) {
console.error('Missing test-ids:', missing)
return false
}
return true
}
```
### **Manual Verification Steps**
1. **Open Browser DevTools** โ Elements tab
2. **Navigate to each page** (Assessments, Domains, Domain Assessment)
3. **Search for `data-testid`** in Elements tab
4. **Verify all required attributes** are present
5. **Check dynamic patterns** by inspecting multiple questions/cards
---
## ๐ **IMPLEMENTATION PRIORITY**
### **Priority 1 (Critical - Required for Basic Automation):**
1. โ
Assessment cards action buttons
2. โ
Domain cards action buttons
3. โ
Domain assessment page container
4. โ
Question shell containers
5. โ
All question type inputs (multiple choice, true/false, rating, open-ended, matrix)
6. โ
Navigation buttons (prev, next, submit)
7. โ
Domain feedback modal inputs
8. โ
Final feedback modal inputs
### **Priority 2 (Important - Required for Complete Automation):**
1. โ ๏ธ Instructions modal
2. โ ๏ธ Submit confirmation modal
3. โ ๏ธ Guidance modal
4. โ ๏ธ Success modal
5. โ ๏ธ Question navigator buttons
### **Priority 3 (Nice to Have - Enhanced Testing):**
1. โ ๏ธ Progress indicators
2. โ ๏ธ Timer displays
3. โ ๏ธ Section headers
---
## ๐ **REFERENCE EXAMPLES**
### **Example 1: Assessment Card**
```jsx
// File: AssessmentSection.jsx or AssessmentCard component
const AssessmentCard = ({ assessment }) => {
const assignmentId = assessment.assignmentId || assessment.id
return (
{assessment.name}
{assessment.description}
)
}
```
### **Example 2: Multiple Choice Question**
```jsx
// File: MultipleChoiceQuestion.jsx
const MultipleChoiceQuestion = ({ question, value, onChange }) => {
const options = question.options || []
return (
{options.map((option, idx) => {
const optionLabel = String.fromCharCode(65 + idx) // A, B, C, D, E
const isSelected = value === option.value
return (
)
})}
)
}
```
### **Example 3: Domain Feedback Modal**
```jsx
// File: DomainAssessmentPage.jsx
{showFeedbackModal && (
Domain Feedback
{feedbackData.question1 === false && (
)}
```
---
## ๐ฏ **SUCCESS CRITERIA**
Implementation is considered complete when:
1. โ
**All Priority 1 attributes** are implemented and verified
2. โ
**All Priority 2 attributes** are implemented and verified
3. โ
**All dynamic patterns** generate correct test-ids
4. โ
**No duplicate test-ids** exist in the DOM
5. โ
**All test-ids follow** the naming convention
6. โ
**Verification script** passes without errors
7. โ
**Manual inspection** confirms all attributes are present
---
## ๐ **SUPPORT & QUESTIONS**
For questions or clarifications about this document:
1. **Review the examples** in Section 7 (Reference Examples)
2. **Check the naming convention** in Section 2 (Naming Convention)
3. **Verify against existing implementations** (login, profile editor)
4. **Contact automation team** for clarification
---
## ๐ **DOCUMENT VERSION HISTORY**
- **v2.0 (2025-01-20):** Final complete requirements - all assessment components
- **v1.0 (2025-01-15):** Initial requirements - login and profile editor
---
**Status:** โ
**READY FOR IMPLEMENTATION**
**Priority:** ๐ด **CRITICAL**
**Estimated Implementation Time:** 2-3 days for complete implementation
---
**๐ LET'S BUILD WORLD-CLASS AUTOMATION TOGETHER!**