336664473b
Anti-EAV Lint + Quality Gate / anti-eav-lint (pull_request) Successful in 15s
Tests / PHP Lint (pull_request) Successful in 17s
Tests / Unit Tests (pull_request) Successful in 51s
Tests / Integration Tests (pull_request) Successful in 1m22s
Tests / PHPCS (pull_request) Successful in 1m12s
Tests / PHPStan (pull_request) Successful in 1m10s
- show_in_rest defaulted to true, so GET /wpdo/v1/listings and /listings/{id} (public by design) returned every registered hot / cold field to anonymous visitors — e.g. infocards tmeetic_ig_access_token_enc / _token_expiry / _user_id and WooCommerce _purchase_note (confirmed on dev36)
- Fields are private unless registered with show_in_rest => true; protected (underscore) and credential-like keys (token, secret, password, api key, private key, credential, salt, nonce) are never exposed
- Zone A list path no longer returns whole rows when nothing is public, and filters / orderby accept public columns only
- Version 1.1.1; CHANGELOG, readme
- Verify: unit 690 (+3), integration 525 (+3 private-column tests, RED on 1.1.0), live suite rest 2/2 (RED on 1.1.0), all live 49/49, phpcs 0, stan OK
61 lines
3.5 KiB
Markdown
61 lines
3.5 KiB
Markdown
# Live test suite
|
||
|
||
Tests that must run inside a real WordPress site, because the stubbed
|
||
`tests/integration` bootstrap cannot reproduce:
|
||
|
||
- WP core meta flows (`update_metadata()` reads the old value through
|
||
`get_metadata_raw()` before writing — the shadow_read write-loss bug lives there)
|
||
- the SQL that `WP_Query` actually builds, and hook priorities
|
||
- HivePress / WooCommerce behaviour (`pre_get_posts` sort clauses, empty-key
|
||
meta reads, direct-SQL stock updates)
|
||
|
||
**Never run against a production site.** Suites create and delete fixtures
|
||
(`tmdo_live_*` users, `tmdo-live-*` terms). Entity modes are overridden in
|
||
process through `pre_option_wpdo_bridge_modes`; nothing is written to
|
||
`wpdo_bridge_modes` or `wpdo_hook_bus_enabled`.
|
||
|
||
The reference site is dev36 (HivePress + Marketplace + WooCommerce), with this
|
||
plugin symlinked from the `plugins-dev` worktree while developing.
|
||
|
||
## Run
|
||
|
||
```bash
|
||
wp --path=/var/www/Studio/wp-local-dev36 eval-file tests/live/run.php <suite> [<suite> ...]
|
||
```
|
||
|
||
Exit code 0 when every test passed, 1 otherwise. Output per test:
|
||
|
||
| Status | Meaning |
|
||
|---|---|
|
||
| PASS / FAIL | normal |
|
||
| XFAIL | known bug, test marked `xfail` with the PR that fixes it; not counted as a failure |
|
||
| XPASS | an `xfail` test passed — counted as a failure so the fixing PR removes the marker |
|
||
| SKIP | the site does not register the key / taxonomy the test needs |
|
||
|
||
## Suites
|
||
|
||
| Suite | Covers |
|
||
|---|---|
|
||
| `shadow_write` | writes in shadow_read reach native meta (user, term, HivePress listing) |
|
||
| `serialized` | array meta values are stored serialized in flat tables, never "Array" |
|
||
| `resync` | dual_write / shadow_read: flat follows native after every write (4 entities × 2 modes: update, same value, delete, refused writes, stale flat, key rename by meta_id) |
|
||
| `router` | a routed WP_Query returns the same ids, in order, as native (OR, several post types, untyped numeric compares, named orderby, LIKE, keys of two groups, NOT EXISTS with the status/date copy route, meta orderby: HivePress sort shape, named clause, meta_key + meta_value_num); routed SQL has no GROUP BY |
|
||
| `rest` | anonymous GET of the public listings endpoints returns no protected or credential-like field (1.1.1) |
|
||
| `zero_side_effect` | zone tables that were never created are never queried on save / delete |
|
||
|
||
## Tools (`tools/`)
|
||
|
||
Benchmark and data-flow helpers used for the 2026-09-26 dev36 integration test.
|
||
Output files go to the current directory (`qbench`) or `$TMDO_LIVE_OUT`
|
||
(default `/tmp`, `run_batch.sh`), never into the repo.
|
||
|
||
| Tool | Use |
|
||
|---|---|
|
||
| `seed.php` | `wp eval-file seed.php <vendors\|listings\|requests\|reviews\|products\|orders\|terms> <n> [tag]` — seed through real HivePress / WC APIs |
|
||
| `run_batch.sh` | `run_batch.sh <tag> [divisor]` — parallel seeding batch (`TMDO_LIVE_WP_PATH`, `TMDO_LIVE_OUT`) |
|
||
| `clone.sql` | bench only: clone hp_listing rows to reach large scale (`sed "s/__K__/<n>/" clone.sql \| wp db query`) |
|
||
| `checker.php` | `wp eval-file checker.php [entity]` — native vs flat consistency per registered key (SQL only) |
|
||
| `qbench.php` / `qdiff.php` | run 16 WP_Query shapes, then diff two runs (native vs routed): result sets, order, latency, SQL errors |
|
||
| `mut.php` | data-flow mutations through HivePress models, WC CRUD and core APIs; prints native / flat / API values |
|
||
| `fe.sh` + `zz-s36-probe.php` | front-end search probe (`TMDO_LIVE_URL`). Copy the probe into `wp-content/mu-plugins/` only for the run and remove it afterwards; it only answers requests carrying `X-S36-Probe: 1` |
|