Commit Graph
4 Commits
Author SHA1 Message Date
Kpa-clawbotandmc-bot b2f0be994d fix(#1498): channels-ws-batch — wait on packetHash, not length (un-skip explicit-sender) (#1511)
## Summary

The channels-ws-batch E2E tests had a race condition causing flaky
failures on CI, blocking PRs #1490, #1500, #1501.

**Root cause:** Tests waited on `messages.length === prev + 1`, but live
WS traffic from the ingestor could bump `length` independently, causing
timeouts. The earlier #1499 fix attempted to find messages by
`m.hash`/`m.id`, but `processWSBatch` stores `packetHash`/`packetId` on
message objects — so the find never matched.

**Fix:** Replace all length-based waiters with `messages.some(m =>
m.packetHash === '<known-hash>')` which is deterministic regardless of
concurrent WS traffic. Also un-skips the explicit-sender test that was
force-skipped in #1502.

## Tests affected
- "processWSBatch with explicit sender appends to messages" —
un-skipped, now passes
- "GRP_TXT shape with 'Sender: text' parses sender from text" —
race-proof
- "dedup by packetHash" — race-proof
- "new WS message while scrolled up" — race-proof

All 6 tests pass locally (6 passed, 0 failed).

Fixes #1498.

---------

Co-authored-by: mc-bot <bot@meshcore.local>
2026-05-30 12:54:02 -07:00
Kpa-clawbotandmc-bot 2196102eae test(channels): skip processWSBatch-explicit-sender step pending #1498 root-cause (#1502)
Master CI failing across all recent PRs due to this single test. The
#1499 find-by-hash fix didn't resolve it — root cause is deeper than the
index-vs-hash race (possibly closure staleness on
`_channelsProcessWSBatchForTest` vs `_channelsGetStateForTest`).

Skipping to unblock master per operator directive. Filed #1498 for
proper diagnosis with CDP repro.

Co-authored-by: mc-bot <bot@meshcore.local>
2026-05-29 17:01:00 +00:00
Kpa-clawbotandmc-bot ebdf51ba54 fix(test): channels-ws-batch race — find injected message by hash not index (#1499)
## Why master CI keeps failing

Real WS messages from the staging ingestor race with the test's
synthetic injection. messages.length jumps prev+2 instead of prev+1, and
messages[length-1] is some XMD packet instead of the synthetic WsAlice —
assertion fails.

Failure log:
```
✗ processWSBatch with explicit sender appends to messages: expected sender WsAlice, got XMD Tag 1
```

Started flaking ~v3.8.2-track when test timing shifted. Test was
authored in #1300.

## Fix

Find injected message by its synthetic hash:
```js
s.messages.find((m) => m.hash === 'wsbatch-explicit-1' || m.id === 'pkt-wsbatch-1')
```

Race-immune regardless of real WS noise. Unblocks master CI.

Co-authored-by: mc-bot <bot@meshcore.local>
2026-05-29 16:04:54 +00:00
d837166158 test(coverage): add Playwright E2E for channels page (#1297 B3) (#1300)
## #1297 B3 — Playwright E2E coverage for `public/channels.js`

Pure-coverage PR. Adds five Playwright suites targeting the largest
under-tested branches of `public/channels.js` (1950 LOC, was **19.9%
statements** per the live coverage refinement in #1297 — the single
biggest delta opportunity in the umbrella). No production code changes.

### Coverage exemption

Per repo `AGENTS.md` TDD rule: this is the **net-new test coverage**
case — there is no production change to gate, so a failing-then-passing
red commit isn't applicable. All five suites exercise existing channels
init() code paths that ship today.

### New test files

| File | Scenarios exercised |
| --- | --- |
| `test-channels-list-render-e2e.js` | Sectioned sidebar (My Channels /
Network / Encrypted) headers, encrypted collapse toggle + localStorage
persistence, row badges + previews, color dot + color clear control,
sidebar resize handle width persist |
| `test-channels-selection-flow-e2e.js` | `selectChannel()` header
update + URL replaceState, message row rendering (avatars, sender
colors, packet links), node detail panel open via mouse + keyboard +
close-with-focus-restore, deep-link route restoration, scroll button
initial state |
| `test-channels-add-modal-e2e.js` | Generate PSK Channel (key + QR +
status banner + localStorage persist), Add PSK invalid hex error path,
Add PSK valid hex success + close + My Channels row, Monitor Hashtag
with and without leading `#`, empty-hashtag no-op, Scan QR unavailable
fallback, Escape close, Remove ✕ flow |
| `test-channels-share-color-e2e.js` | Share modal normal mode
(dedicated `#chShareModal` with QR + Hex Key + Copy success label),
Share modal error mode (`openShareModalError` when no stored key — field
groups hidden), Escape close, `ChannelColorPicker.show` invocation on
color-dot click, keyboard Enter on a `[data-share-channel]` span |
| `test-channels-ws-batch-e2e.js` | `processWSBatch` via
`_channelsProcessWSBatchForTest`: explicit-sender append, `"Sender:
text"` parsing branch, packetHash dedup + observer accumulation,
new-channel append (channel previously unseen), scroll-button branch
when user not at bottom, region-filter exclusion code path |

All five tests wired into `.github/workflows/deploy.yml` after the
existing `test-channel-fluid-e2e.js` step.

### Preflight

`bash ~/.openclaw/skills/pr-preflight/scripts/run-all.sh origin/master`
→
exit 0, all gates pass (PII, CSS vars, branch scope, etc.).

Refs #1297

---------

Co-authored-by: openclaw-bot <openclaw-bot@users.noreply.github.com>
Co-authored-by: openclaw-bot <bot@openclaw.local>
Co-authored-by: mc-bot <bot@meshcore.local>
2026-05-29 11:46:51 +00:00