TenantAtlas/specs/003-settings-catalog-readable/MANUAL_VERIFICATION_GUIDE.md
2025-12-14 19:56:31 +01:00

313 lines
8.8 KiB
Markdown

# 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)
1. Open browser: `http://localhost` (or your Sail URL)
2. Login to Filament admin panel
3. Navigate to **Policies** resource
4. Click on a **Settings Catalog** policy (look for `settingsCatalogPolicy` type)
**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 `versions` relationship 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 === true` in 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`)
- ✅ 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-json` package 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**:
1. Run: `./vendor/bin/sail artisan tinker`
2. Execute: `\App\Models\SettingsCatalogDefinition::truncate();`
3. Navigate to Policy View for Settings Catalog policy
4. 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_cached` correctly 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**:
1. Manually trigger sync:
```bash
./vendor/bin/sail artisan tinker
```
```php
$policy = \App\Models\Policy::first();
\App\Jobs\SyncPoliciesJob::dispatch();
```
2. Check logs for Graph API errors:
```bash
./vendor/bin/sail artisan log:show
```
### Issue: Accordion doesn't render
**Cause**: Blade component error or missing groups
**Solution**:
1. Check browser console for errors
2. Verify normalizer output:
```bash
./vendor/bin/sail artisan tinker
```
```php
$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**:
1. Verify Alpine.js loaded:
- Open browser console
- Type `window.Alpine` → should return object
2. Check HTTPS or localhost (clipboard API requires secure context)
3. Fallback: Use "View JSON" tab and copy from there
---
## Next Steps After Verification
### If All Tests Pass ✅
Proceed to **Phase 7: Testing & Validation**
1. Write unit tests (T026-T031)
2. Write feature tests (T032-T037)
3. Run Pest suite (T038-T039)
4. Manual QA walkthrough (T040-T042)
**Estimated Time**: ~5-7 hours
### If Issues Found ⚠️
1. Document issues in `specs/185-settings-catalog-readable/ISSUES.md`
2. Fix critical issues (broken UI, errors)
3. Re-run verification steps
4. Proceed to Phase 7 only after verification passes
---
## Reporting Results
After completing verification, update tasks.md:
```bash
# Mark T023-T025 as complete
vim specs/185-settings-catalog-readable/tasks.md
```
Add implementation notes:
```markdown
- [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:
1. Check logs: `./vendor/bin/sail artisan log:show`
2. Review implementation status: `specs/185-settings-catalog-readable/IMPLEMENTATION_STATUS.md`
3. Review code: `app/Services/Intune/`, `app/Filament/Resources/PolicyResource.php`
4. Ask for help with specific error messages and context
---
**End of Manual Verification Guide**