# Data-TestID Pattern Rules **Purpose**: Universal rules that survive code changes **Based On**: Automation test requirements + existing code patterns **Verification**: Pattern-based (not file-specific) --- ## 🎯 CORE PATTERN ``` {scope}__{element_name} ``` ### Rules: 1. **Double underscore (`__`)** separates scope from element name 2. **Single underscore (`_`)** within element names for readability 3. **All lowercase** - no camelCase, no PascalCase 4. **Snake_case** throughout --- ## 📋 SCOPE DEFINITIONS | Scope | Purpose | Example Files | |-------|---------|---------------| | `student_login` | Student login page | SignInPage.jsx | | `student_nav` | Student navigation header | Design1Header.jsx | | `mandatory_reset` | Mandatory password reset modal | MandatoryPasswordResetModal.jsx | | `profile_incomplete` | Profile incomplete modal | ProfileIncompleteModal.jsx | | `profile_editor` | Profile editor form | StudentProfileEditor.jsx | | `dashboard` | Dashboard page | DashboardPage.jsx | | `assessment_card` | Assessment card component | ProductCard.jsx | --- ## 🔤 ELEMENT NAME PATTERNS ### Input Fields ``` {scope}__{field_name}_input ``` **Examples:** - `student_login__identifier_input` - `profile_editor__first_name_input` - `mandatory_reset__current_password_input` ### Select/Dropdown ``` {scope}__{field_name}_select ``` **Examples:** - `profile_editor__gender_select` - `profile_editor__board_stream_select` ### Textarea ``` {scope}__{field_name}_textarea ``` **Examples:** - `profile_editor__specially_abled_details_textarea` - `profile_editor__achievement_academics_textarea` ### Checkbox ``` {scope}__{field_name}_checkbox ``` **Examples:** - `student_login__remember_checkbox` - `profile_editor__specially_abled_checkbox` ### Buttons ``` {scope}__{action}_button ``` **Examples:** - `student_login__submit_button` - `profile_editor__save_button` - `profile_editor__prev_button` - `profile_editor__next_button` - `profile_editor__cancel_button` ### Links ``` {scope}__{destination}_link ``` **Examples:** - `student_nav__dashboard_link` - `student_nav__assessments_link` ### Modals/Containers ``` {scope}__modal {scope}__form {scope}__dropdown ``` **Examples:** - `mandatory_reset__modal` - `student_login__form` - `student_nav__profile_dropdown` ### Error Messages ``` {scope}__{field_name}_error {scope}__error_banner {scope}__error_toast ``` **Examples:** - `mandatory_reset__current_password_error` - `student_login__error_banner` - `student_login__error_toast` ### Progress/Status ``` {scope}__progress_value ``` **Examples:** - `profile_editor__progress_value` - `profile_incomplete__progress_value` --- ## 🔄 DYNAMIC PATTERNS ### Dynamic Collections (Checkboxes, Cards) ``` {scope}__{base_name}__{formatted_value} ``` **Formatting Function** (if needed): ```javascript const formatTestId = (text) => { return text .toLowerCase() .replace(/^\d+\.\s*/, '') // Remove leading number and dot .replace(/\s+/g, '_') // Replace spaces with underscores .replace(/[^a-z0-9_]/g, '') // Remove special characters } ``` **Examples:** - `profile_editor__short_term_focus__academics` (from "01. Academics") - `profile_editor__club__science_club` (from "1. Science Club") - `assessment_card__{assignmentId}` (dynamic ID) - `assessment_card__{assignmentId}__action` (dynamic action button) ### Tab Navigation ``` {scope}__tab_{formatted_tab_name} ``` **Examples:** - `profile_editor__tab_personal_information` - `profile_editor__tab_contact_information` --- ## ⚠️ CRITICAL RULES 1. **NEVER use single underscore between scope and element** - ❌ `student_login_identifier_input` - ✅ `student_login__identifier_input` 2. **NEVER use camelCase or PascalCase** - ❌ `studentLogin__identifierInput` - ❌ `StudentLogin__IdentifierInput` - ✅ `student_login__identifier_input` 3. **NEVER use hyphens** - ❌ `student-login__identifier-input` - ✅ `student_login__identifier_input` 4. **ALWAYS use descriptive element names** - ❌ `profile_editor__btn1` - ✅ `profile_editor__save_button` 5. **For dynamic values, use double underscore before dynamic part** - ✅ `profile_editor__short_term_focus__academics` - ❌ `profile_editor__short_term_focus_academics` --- ## ✅ VERIFICATION PATTERN All attributes must match this regex: ```regex ^[a-z][a-z0-9_]*__[a-z][a-z0-9_]*(__[a-z0-9_]+)*$ ``` **Breakdown:** - `^[a-z][a-z0-9_]*` - Scope (starts with lowercase letter) - `__` - Double underscore separator - `[a-z][a-z0-9_]*` - Element name (starts with lowercase letter) - `(__[a-z0-9_]+)*` - Optional dynamic parts (each prefixed with `__`) --- **Note**: These rules are universal and apply to ALL future implementations, regardless of code changes.