107 lines
3.7 KiB
Markdown
107 lines
3.7 KiB
Markdown
# Testing
|
|
|
|
**Analysis Date:** 2026-05-05
|
|
|
|
## Framework
|
|
|
|
None. No PHPUnit, no Jest, no Vitest. No automated test runner configured.
|
|
|
|
**Only testing mechanism:** Two manual PHP scripts in the project root, run in-browser while logged in as admin against the live database.
|
|
|
|
## Test Files
|
|
|
|
| File | Type | Purpose |
|
|
|------|------|---------|
|
|
| `test-yacht-plugin.php` | Smoke test | Verifies plugin environment is set up correctly |
|
|
| `test-api-availability.php` | Integration test | Exercises REST endpoint + Availability class |
|
|
|
|
**How to run:**
|
|
```
|
|
# Syntax check (run after every PHP edit):
|
|
php -l wp-content/plugins/yacht-booking-system/includes/class-booking.php
|
|
|
|
# Browser smoke test (must be logged in as admin):
|
|
http://jachty.pagedev.local/test-yacht-plugin.php
|
|
|
|
# Browser integration test:
|
|
http://jachty.pagedev.local/test-api-availability.php
|
|
```
|
|
|
|
## What Is Tested
|
|
|
|
### test-yacht-plugin.php (Smoke Test)
|
|
1. Plugin file exists on disk
|
|
2. Plugin is active (`is_plugin_active()`)
|
|
3. `wp_yacht_availability` table exists
|
|
4. CPTs registered (`yacht`, `yacht_booking`)
|
|
5. Plugin options set (`yacht_booking_version`, `yacht_booking_installed_at`)
|
|
6. Custom capabilities assigned to `administrator` role
|
|
7. REST namespace `yacht-booking/v1` registered + route list
|
|
8. Admin menu `yacht-bookings` slug present
|
|
9. Yacht CPT CRUD: `wp_insert_post()` + meta + `wp_delete_post()` (cleanup included)
|
|
|
|
### test-api-availability.php (Integration Test)
|
|
1. Fetch first yacht from DB
|
|
2. Call `/availability/{yacht_id}` via `wp_remote_get()` — check HTTP 200, count statuses
|
|
3. Direct call `Availability::get_availability_calendar()` — display in HTML table
|
|
4. Direct call `Availability::is_available()` on +7 to +10 day range
|
|
5. `mark_as_booked()` with fake booking ID 999 → re-check → `clear_booking_availability(999)` → re-check (full CRUD cycle)
|
|
|
|
## What Is NOT Tested
|
|
|
|
- `POST /bookings` — full booking creation flow via REST never tested
|
|
- Email sending (`send_booking_notification`, `send_customer_notification`, `Inquiry::send_emails`)
|
|
- Google Calendar OAuth flow
|
|
- GCal sync (push and pull)
|
|
- iCal import and export
|
|
- Admin form processing (`process_yacht_save`, `process_booking_actions`, `save_settings`)
|
|
- Nonce verification in REST endpoints
|
|
- Status transitions (`pending` → `confirmed` → `cancelled`) and side effects
|
|
- `Shortcode::render_calendar()` output
|
|
- `Calendar_Widget::render()` output
|
|
- All JavaScript behavior
|
|
- Concurrent booking race conditions
|
|
- `mark_as_available()` bug (deletes all rows for yacht — see concerns.md)
|
|
|
|
## Test Pattern
|
|
|
|
```php
|
|
// Access guard
|
|
require_once __DIR__ . '/wp-load.php';
|
|
if (!current_user_can('manage_options')) { die('Admin only'); }
|
|
|
|
// Numbered HTML sections
|
|
echo '<h2>1. Section Name</h2>';
|
|
|
|
// Visual pass/fail — no assertions that throw
|
|
if ($condition) {
|
|
echo '✅ Thing works<br>';
|
|
} else {
|
|
echo '❌ Thing broken<br>';
|
|
die(); // hard stop only on fatal blockers
|
|
}
|
|
|
|
// Data output
|
|
echo '<details><summary>Raw data</summary><pre>';
|
|
print_r($data);
|
|
echo '</pre></details>';
|
|
```
|
|
|
|
## Mocking
|
|
|
|
None. All tests hit the live WordPress database. Side effects are real:
|
|
- `test-yacht-plugin.php`: creates and deletes a test yacht post
|
|
- `test-api-availability.php`: inserts availability rows with `booking_id=999`, then deletes them
|
|
|
|
## Coverage Tooling
|
|
|
|
None. No coverage measurement.
|
|
|
|
## Style Notes in Test Files
|
|
|
|
Intentional deviations from plugin code conventions (acceptable for dev-only scripts):
|
|
- Short array syntax `[]` used (plugin uses `array()`)
|
|
- No namespaces
|
|
- Partial output escaping — `$yacht->post_title` sometimes raw-echoed
|
|
- One raw `$wpdb->get_var()` without `prepare()` (`test-yacht-plugin.php:49`) — safe here as table name is not user input
|