# Task 4: data-testid Verification — Login Page # Date: 2026-03-01 ## Note: Inertia/Vue SPA — data-testid renders client-side, not in initial HTML ## curl -s http://cts-work.test/login returns raw HTML before Vue hydration ## data-testid attributes are compiled into the JS bundles ## Login JS bundle data-testid count: # grep -o 'data-testid' public/build/assets/Login-*.js | wc -l # Result: 3 (login-oauth-button, login-test-button, guest-layout-logo-link) ## Total data-testid in built JS: # grep -roh 'data-testid' public/build/assets/*.js | wc -l # Result: 90 ## Total data-testid in Vue source files: # grep -roh 'data-testid' resources/js/ | wc -l # Result: 98 ## Breakdown by file (source): # Login.vue: 2 (login-oauth-button, login-test-button) # Dashboard.vue: 1 (dashboard-welcome-text) # Services/Index.vue: 9 (empty, table, row, reopen, download, edit, finalize, confirm-cancel, confirm-submit) # Services/Edit.vue: 3 (back-icon, back, block-toggle) # Songs/Index.vue: 14 (upload-area, file-input, search, clear, edit, translate, download, delete, pagination x2, delete-cancel, delete-confirm, edit-modal) # Songs/Translate.vue: 8 (back, url-input, fetch, source-textarea, apply, save, original-textarea, translation-textarea) # InformationBlock.vue: 3 (block, uploader, grid) # ModerationBlock.vue: 3 (block, uploader, grid) # SermonBlock.vue: 3 (block, uploader, grid) # SongsBlock.vue: 9 (block, song-card, request, search, select, assign, translation-checkbox, preview, download) # ArrangementConfigurator.vue: 7 (configurator, select, add, clone, delete, drag-handle, remove) # SlideUploader.vue: 4 (uploader, expire-input, error-dismiss, dropzone) # SlideGrid.vue: 6 (grid, delete, fullimage-link, expire-input, expire-save, expire-cancel) # SongEditModal.vue: 6 (modal, close, error-close, title-input, ccli-input, copyright-textarea) # SongPreviewModal.vue: 5 (modal, pdf-link, close, error-close, bottom-close) # AuthenticatedLayout.vue: 12 (logo, nav-services, nav-songs, sync-timestamp, sync-button, user-dropdown, logout, hamburger, mobile-nav-services, mobile-nav-songs, mobile-sync, mobile-logout) # GuestLayout.vue: 1 (logo-link) # MainLayout.vue: 1 (main-layout) # ConfirmDialog.vue: 2 (cancel, confirm)