8.8 KiB
Feature 185: Manual Verification Guide (Phase 6)
Quick Start
Estimated Time: 20 minutes
Prerequisites: Settings Catalog policy exists in database with snapshot
Verification Steps
Step 1: Navigate to Policy View (2 min)
- Open browser:
http://localhost(or your Sail URL) - Login to Filament admin panel
- Navigate to Policies resource
- Click on a Settings Catalog policy (look for
settingsCatalogPolicytype)
Expected Result:
- ✅ Page loads without errors
- ✅ Policy details visible
- ✅ No browser console errors
If it fails:
- Check browser console for JavaScript errors
- Run
./vendor/bin/sail artisan optimize:clear - Verify policy has
versionsrelationship loaded
Step 2: Verify Tabs Present (2 min)
Action: Look at the Policy View infolist
Expected Result:
- ✅ "Settings" tab visible
- ✅ "JSON" tab visible
- ✅ Settings tab is default (active)
If tabs missing:
- Check if policy is actually Settings Catalog type
- Verify PolicyResource.php has Tabs component for
policy_content - Check Feature 002 JSON viewer implementation
Step 3: Verify Settings Tab - Accordion (5 min)
Action: Click on "Settings" tab (if not already active)
Expected Result:
- ✅ Accordion groups render
- ✅ Each group has:
- Title (e.g., "Device Vendor Msft", "Biometric Authentication")
- Description (if available)
- Setting count badge (e.g., "12 settings")
- ✅ First group expanded by default
- ✅ Other groups collapsed
- ✅ Click group header toggles collapse/expand
If accordion missing:
- Check if
metadata.definitions_cached === truein snapshot - Verify normalizer returns groups structure
- Check Blade component exists:
settings-catalog-grouped.blade.php
Step 4: Verify Display Names (Not Definition IDs) (3 min)
Action: Expand a group and look at setting labels
Expected Result:
- ✅ Labels show human-readable names:
- ✅ "Biometric Authentication" (NOT
device_vendor_msft_policy_biometric_authentication) - ✅ "Password Minimum Length" (NOT
device_vendor_msft_policy_password_minlength)
- ✅ "Biometric Authentication" (NOT
- ✅ No
device_vendor_msft_...visible in labels
If definition IDs visible:
- Check if definitions cached in database:
SettingsCatalogDefinition::count() - Run policy sync manually to trigger cache warming
- Verify fallback message visible: "Definitions not yet cached..."
Step 5: Verify Value Formatting (5 min)
Action: Look at setting values in different groups
Expected Result:
- ✅ Boolean values: Badges with "Enabled" (green) or "Disabled" (gray)
- ✅ Integer values: Formatted with separators (e.g., "1,000" not "1000")
- ✅ String values: Truncated if >100 chars with "..."
- ✅ Choice values: Show choice label (not raw ID)
If formatting incorrect:
- Check
formatSettingsCatalogValue()method in PolicyNormalizer - Verify Blade component conditionals for value types
- Inspect browser to see actual rendered HTML
Step 6: Test Copy Buttons (2 min)
Action: Find a setting with a long value, click copy button
Expected Result:
- ✅ Copy button visible for long values
- ✅ Click copy button → clipboard receives value
- ✅ Button shows checkmark for 2 seconds
- ✅ Button returns to copy icon after timeout
If copy button missing/broken:
- Check Alpine.js loaded (inspect page source for
@livewireScripts) - Verify clipboard API available (requires HTTPS or localhost)
- Check browser console for JavaScript errors
Step 7: Test Search Filtering (Optional - if search visible) (2 min)
Action: Type in search box (if visible at top of Settings tab)
Expected Result:
- ✅ Search box visible with placeholder "Search settings..."
- ✅ Type search query (e.g., "biometric")
- ✅ Only matching settings shown
- ✅ Non-matching groups hidden/empty
- ✅ Clear search resets view
If search not visible:
- This is expected for MVP (Blade-level implementation, no dedicated input yet)
- Search logic exists in Blade template but may need Livewire wiring
Step 8: Verify JSON Tab (2 min)
Action: Click "JSON" tab
Expected Result:
- ✅ Tab switches to JSON view
- ✅ Snapshot renders with syntax highlighting
- ✅ Copy button visible at top
- ✅ Click copy button → full JSON copied to clipboard
- ✅ Can switch back to Settings tab
If JSON tab broken:
- Verify Feature 002 implementation still intact
- Check
pepperfm/filament-jsonpackage installed - Verify PolicyResource.php has JSON ViewEntry
Step 9: Test Fallback Message (3 min)
Action: Find a Settings Catalog policy WITHOUT cached definitions (or manually delete definitions from database)
Steps to test:
- Run:
./vendor/bin/sail artisan tinker - Execute:
\App\Models\SettingsCatalogDefinition::truncate(); - Navigate to Policy View for Settings Catalog policy
- Click Settings tab
Expected Result:
- ✅ Settings tab shows fallback message:
- "Definitions not yet cached. Settings will be shown with raw IDs."
- Helper text: "Switch to JSON tab or wait for next sync"
- ✅ JSON tab still accessible
- ✅ No error messages or broken layout
If fallback not visible:
- Check conditional rendering in PolicyResource.php
- Verify
metadata.definitions_cachedcorrectly set in snapshot - Check Blade component has fallback TextEntry
Step 10: Test Dark Mode (Optional) (2 min)
Action: Toggle Filament dark mode (if available)
Expected Result:
- ✅ Accordion groups adjust colors
- ✅ Badges adjust colors (dark mode variants)
- ✅ Text remains readable
- ✅ No layout shifts or broken styles
If dark mode broken:
- Check Blade component uses
dark:Tailwind classes - Verify Filament Section components support dark mode
- Inspect browser to see actual computed styles
Success Criteria Checklist
After completing all steps, mark these off:
- T023: JSON tab works (from Feature 002)
- T024: Fallback message shows when definitions not cached
- T025: JSON viewer only renders on Policy View (not globally)
Common Issues & Solutions
Issue: "Definitions not yet cached" persists
Cause: SyncPoliciesJob hasn't run yet or Graph API call failed
Solution:
- Manually trigger sync:
./vendor/bin/sail artisan tinker$policy = \App\Models\Policy::first(); \App\Jobs\SyncPoliciesJob::dispatch(); - Check logs for Graph API errors:
./vendor/bin/sail artisan log:show
Issue: Accordion doesn't render
Cause: Blade component error or missing groups
Solution:
- Check browser console for errors
- Verify normalizer output:
./vendor/bin/sail artisan tinker$policy = \App\Models\Policy::first(); $snapshot = $policy->versions()->orderByDesc('captured_at')->value('snapshot'); $normalizer = app(\App\Services\Intune\PolicyNormalizer::class); $groups = $normalizer->normalizeSettingsCatalogGrouped($snapshot['settings'] ?? []); dd($groups);
Issue: Copy buttons don't work
Cause: Alpine.js not loaded or clipboard API unavailable
Solution:
- Verify Alpine.js loaded:
- Open browser console
- Type
window.Alpine→ should return object
- Check HTTPS or localhost (clipboard API requires secure context)
- Fallback: Use "View JSON" tab and copy from there
Next Steps After Verification
If All Tests Pass ✅
Proceed to Phase 7: Testing & Validation
- Write unit tests (T026-T031)
- Write feature tests (T032-T037)
- Run Pest suite (T038-T039)
- Manual QA walkthrough (T040-T042)
Estimated Time: ~5-7 hours
If Issues Found ⚠️
- Document issues in
specs/185-settings-catalog-readable/ISSUES.md - Fix critical issues (broken UI, errors)
- Re-run verification steps
- Proceed to Phase 7 only after verification passes
Reporting Results
After completing verification, update tasks.md:
# Mark T023-T025 as complete
vim specs/185-settings-catalog-readable/tasks.md
Add implementation notes:
- [X] **T023** Verify JSON tab still works
- **Implementation Note**: Verified tabs functional, JSON viewer renders snapshot
- [X] **T024** Add fallback for policies without cached definitions
- **Implementation Note**: Fallback message shows info with guidance to JSON tab
- [X] **T025** Ensure JSON viewer only renders on Policy View
- **Implementation Note**: Verified scoping correct, only shows on Policy resource
Contact & Support
If verification fails or you need assistance:
- Check logs:
./vendor/bin/sail artisan log:show - Review implementation status:
specs/185-settings-catalog-readable/IMPLEMENTATION_STATUS.md - Review code:
app/Services/Intune/,app/Filament/Resources/PolicyResource.php - Ask for help with specific error messages and context
End of Manual Verification Guide