# Admin Integration Testing Checklist

## Pre-Testing Setup

- [ ] Ensure WordPress is running (local or staging environment)
- [ ] Plugin files are in `/wp-content/plugins/multilingual-press-zone/`
- [ ] Database tables have been created (plugin activation hook)
- [ ] User is logged in with `manage_options` capability (Administrator)

---

## Phase 1: Plugin Activation

### 1.1 Activate Plugin
```bash
# Via WP-CLI (recommended)
wp plugin activate multilingual-press-zone

# OR via WordPress Admin
# Navigate to: Plugins → Inactive → Multilingual Press Zone → Activate
```

**Expected Result:**
- [ ] Plugin activates without errors
- [ ] Database tables created (`wp_mpz_languages`, `wp_mpz_translations`)
- [ ] No PHP warnings/errors in debug log
- [ ] Default English language seeded

### 1.2 Verify PHP Syntax
```bash
cd /path/to/wp-content/plugins/multilingual-press-zone

# Test all Admin controllers
php -l includes/Admin/DashboardController.php
php -l includes/Admin/MenuController.php
php -l includes/Admin/AssetLoader.php
php -l includes/Admin/LanguagesController.php
php -l includes/Admin/TranslationsController.php
php -l includes/Admin/SettingsController.php
php -l includes/Admin/LicensingController.php
```

**Expected Result:**
- [ ] All files: "No syntax errors detected"

---

## Phase 2: Admin Menu

### 2.1 Check Menu Appears
- [ ] Navigate to WordPress admin dashboard
- [ ] Look for "Multilingual" menu item in left sidebar
- [ ] Menu icon is translation/globe icon (dashicons-translation)
- [ ] Menu position is after Settings (position 30)

### 2.2 Verify Submenu Structure
Hover over "Multilingual" menu, verify submenu items:
- [ ] Dashboard (first item)
- [ ] Languages
- [ ] Translations
- [ ] Settings
- [ ] Licensing

### 2.3 Check Menu Access Control
- [ ] Login as Administrator → Menu visible ✓
- [ ] Login as Editor → Menu hidden ✓
- [ ] Login as Author → Menu hidden ✓
- [ ] Login as Subscriber → Menu hidden ✓

---

## Phase 3: Page Rendering

### 3.1 Dashboard Page
Click: Multilingual → Dashboard

**Expected Result:**
- [ ] Page loads without errors
- [ ] URL: `/wp-admin/admin.php?page=multilingual-press-zone`
- [ ] Page title: "Multilingual"
- [ ] Container div present: `<div id="mpz-dashboard-root"></div>`
- [ ] No PHP errors/warnings
- [ ] Admin header/footer visible

### 3.2 Languages Page
Click: Multilingual → Languages

**Expected Result:**
- [ ] Page loads without errors
- [ ] URL: `/wp-admin/admin.php?page=mpz-languages`
- [ ] Container div present: `<div id="mpz-languages-root"></div>`
- [ ] No PHP errors/warnings

### 3.3 Translations Page
Click: Multilingual → Translations

**Expected Result:**
- [ ] Page loads without errors
- [ ] URL: `/wp-admin/admin.php?page=mpz-translations`
- [ ] Container div present: `<div id="mpz-translations-root"></div>`
- [ ] No PHP errors/warnings

### 3.4 Settings Page
Click: Multilingual → Settings

**Expected Result:**
- [ ] Page loads without errors
- [ ] URL: `/wp-admin/admin.php?page=mpz-settings`
- [ ] Container div present: `<div id="mpz-settings-root"></div>`
- [ ] No PHP errors/warnings

### 3.5 Licensing Page
Click: Multilingual → Licensing

**Expected Result:**
- [ ] Page loads without errors
- [ ] URL: `/wp-admin/admin.php?page=mpz-licensing`
- [ ] Container div present: `<div id="mpz-licensing-root"></div>`
- [ ] No PHP errors/warnings

---

## Phase 4: Asset Loading

### 4.1 JavaScript Files
Open browser DevTools → Network tab, reload Dashboard page

**Expected Assets:**
- [ ] `runtime.js` loads (HTTP 200)
- [ ] `main.js` loads (HTTP 200)
- [ ] No 404 errors for JS files
- [ ] Scripts load in footer (not header)

### 4.2 CSS Files
Check Network tab for CSS:
- [ ] `admin.css` loads (HTTP 200)
- [ ] No 404 errors for CSS files

### 4.3 WordPress Media Uploader
Check that WordPress media scripts are enqueued:
- [ ] No errors in console about missing media scripts

---

## Phase 5: JavaScript Global Objects

### 5.1 Global Config (All Pages)
Open browser console on any plugin page:
```javascript
console.log(window.mpzConfig);
```

**Expected Output:**
```javascript
{
  restUrl: "https://yoursite.com/wp-json/multilingual-press-zone/v1/",
  restNonce: "abc123...",
  ajaxUrl: "https://yoursite.com/wp-admin/admin-ajax.php",
  pluginUrl: "https://yoursite.com/wp-content/plugins/multilingual-press-zone/",
  version: "1.0.0",
  darkMode: false,
  i18n: {
    save: "Save",
    cancel: "Cancel",
    // ... more strings
  }
}
```

**Checklist:**
- [ ] `mpzConfig` object exists
- [ ] `restUrl` is valid URL
- [ ] `restNonce` is non-empty string
- [ ] `ajaxUrl` is valid URL
- [ ] `pluginUrl` is valid URL
- [ ] `version` matches plugin version
- [ ] `darkMode` is boolean
- [ ] `i18n` object contains translations

### 5.2 Dashboard Data
On Dashboard page:
```javascript
console.log(window.mpzDashboard);
```

**Expected:**
- [ ] `mpzDashboard` object exists
- [ ] `languages` is array
- [ ] `stats` object with `languageCount`, `translationCount`
- [ ] `restUrl` and `nonce` present

### 5.3 Languages Data
On Languages page:
```javascript
console.log(window.mpzLanguages);
```

**Expected:**
- [ ] `mpzLanguages` object exists
- [ ] `languages` is array of installed languages
- [ ] `availableLanguages` is array of 20 language options
- [ ] Each language has: code, name, native_name, flag_code

### 5.4 Translations Data
On Translations page:
```javascript
console.log(window.mpzTranslations);
```

**Expected:**
- [ ] `mpzTranslations` object exists
- [ ] `languages` array present

### 5.5 Settings Data
On Settings page:
```javascript
console.log(window.mpzSettings);
```

**Expected:**
- [ ] `mpzSettings` object exists
- [ ] `settings` object with configuration:
  - [ ] `api_url` (default: 'https://api.press.zone')
  - [ ] `default_language` (default: 'en')
  - [ ] `auto_translate` (boolean)
  - [ ] `show_flags` (boolean)
  - [ ] `url_mode` (string)
  - [ ] `cache_enabled` (boolean)
  - [ ] `cache_ttl` (number)

### 5.6 Licensing Data
On Licensing page:
```javascript
console.log(window.mpzLicensing);
```

**Expected:**
- [ ] `mpzLicensing` object exists
- [ ] `license` object with:
  - [ ] `key` (masked or empty)
  - [ ] `status` (string)
  - [ ] `expires` (date string or empty)
  - [ ] `site_url` (current site URL)
  - [ ] `site_name` (site name)

---

## Phase 6: REST API Configuration

### 6.1 REST API Availability
```bash
# Test REST API endpoint (should 404 for now, but API should be reachable)
curl https://yoursite.com/wp-json/multilingual-press-zone/v1/
```

**Expected:**
- [ ] REST API responds (even if 404)
- [ ] No server errors (500)
- [ ] `restUrl` in JavaScript matches actual endpoint

### 6.2 Nonce Validation
Check nonce in JavaScript console:
```javascript
// Nonce should be valid for current user session
console.log(window.mpzConfig.restNonce);
```

**Expected:**
- [ ] Nonce is 10-character alphanumeric string
- [ ] Changes on each page load
- [ ] Valid for current user

---

## Phase 7: Security Verification

### 7.1 Capability Checks
Test access control:
1. **As Administrator (has `manage_options`):**
   - [ ] Can access all menu items
   - [ ] Pages render correctly

2. **As Editor (no `manage_options`):**
   - [ ] Menu items hidden
   - [ ] Direct URL access shows error: "You do not have sufficient permissions"

### 7.2 Output Escaping
View page source, check for:
- [ ] No unescaped user data in HTML
- [ ] All attributes use `esc_attr()`
- [ ] All text uses `esc_html()`
- [ ] All URLs use `esc_url()`

### 7.3 CSRF Protection
- [ ] Nonces present in JavaScript globals
- [ ] Nonces match WordPress session
- [ ] No exposed API keys or secrets in JavaScript

---

## Phase 8: Internationalization

### 8.1 String Translation
Check JavaScript i18n object:
```javascript
console.log(window.mpzConfig.i18n);
```

**Expected strings:**
- [ ] save, cancel, delete, edit, add, remove, close
- [ ] success, error, warning, info
- [ ] loading, saving, deleting
- [ ] confirmDelete, unsavedChanges
- [ ] requiredField, invalidFormat
- [ ] noResults, noData, emptyList

### 8.2 Text Domain
Search codebase for text domain usage:
```bash
grep -r "multilingual-press-zone" includes/Admin/*.php
```

**Expected:**
- [ ] All `__()` calls use correct text domain
- [ ] No hardcoded strings (all translatable)

---

## Phase 9: Dark Mode

### 9.1 Check Dark Mode Preference
```javascript
// Default should be false
console.log(window.mpzConfig.darkMode);
```

**Expected:**
- [ ] Returns boolean value
- [ ] Reflects user meta `mpz_dark_mode`

### 9.2 CSS Dark Mode Support
Check admin.css for:
- [ ] `@media (prefers-color-scheme: dark)` rules exist
- [ ] WordPress admin color scheme support (midnight, ectoplasm)

---

## Phase 10: Browser Compatibility

Test in multiple browsers:

### Chrome/Edge
- [ ] Menu renders correctly
- [ ] Assets load without errors
- [ ] Console shows no errors

### Firefox
- [ ] Menu renders correctly
- [ ] Assets load without errors
- [ ] Console shows no errors

### Safari
- [ ] Menu renders correctly
- [ ] Assets load without errors
- [ ] Console shows no errors

---

## Phase 11: Performance

### 11.1 Asset Size Check
```bash
ls -lh admin/dist/js/
ls -lh admin/dist/css/
```

**Expected:**
- [ ] JavaScript bundles < 100KB each
- [ ] CSS file < 50KB
- [ ] No massive unminified files

### 11.2 Page Load Time
Use browser DevTools → Performance tab:
- [ ] Page loads in < 2 seconds
- [ ] No long-running scripts blocking render
- [ ] No layout thrashing

### 11.3 Asset Caching
Check HTTP headers:
- [ ] Assets versioned with `MPZ_VERSION`
- [ ] Browser caches assets correctly

---

## Phase 12: Error Handling

### 12.1 PHP Errors
Enable WordPress debug mode:
```php
// wp-config.php
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
```

Check debug log:
- [ ] No PHP warnings/notices
- [ ] No deprecated function calls
- [ ] No undefined variables/constants

### 12.2 JavaScript Errors
Open console on each page:
- [ ] No JavaScript errors
- [ ] No 404s for assets
- [ ] No CORS errors

---

## Issues Found

| Issue | Page | Severity | Status |
|-------|------|----------|--------|
|       |      |          |        |

---

## Test Environment

- **WordPress Version:** _______
- **PHP Version:** _______
- **Database:** _______
- **Browser:** _______
- **OS:** _______
- **Test Date:** _______
- **Tester:** _______

---

## Sign-Off

- [ ] All critical tests passed
- [ ] No blocking issues found
- [ ] Ready for production deployment

**Tester Signature:** _______________
**Date:** _______________
