Real‑World QA Test Plan
Real‑World QA Test Plan
Use this printer‑friendly checklist to validate meshbbs behavior against a live Meshtastic device and the shared mesh. Keep a notes doc during testing with exact commands sent, observed responses, and relevant meshbbs.log
snippets.
Tip for printing: Use your browser’s Print function to save this page as a PDF.
Setup
Prereqs
- One Meshtastic device connected and configured to the same channel as your BBS
- macOS Terminal (zsh)
- Current repo builds and tests pass
Build and run
- Build:
cargo build --release
- Start:
./target/release/meshbbs start
- Confirm server logs show your Meshtastic port and that the device is connected
Data safety
- Backup confirmed:
config.toml
anddata/topics.json
config.toml
contains a valid sysop name and password set (seemeshbbs sysop-passwd
)
Note: For any problem found, capture the exact command, what happened, and relevant excerpts from meshbbs.log
.
Public channel (shared mesh) sanity
Note: Public commands use a configurable prefix. The default is ^
. In the examples below, replace ^
with your configured prefix if different.
^HELP
(from your Meshtastic client)
Expect:
- A DM arrives with compact help guidance
- A delayed public notice may appear after the DM (scheduler delay)
Check:
- DM contains a concise help sentence (not verbose), fits in one frame with prompt
- You see the prompt at the end of the DM:
unauth>
(if not logged in)
^LOGIN alice
Expect:
- Public reply indicates login pending for
alice
- You’re told to open DM to continue
^WEATHER
(optional)
Expect:
- Either a broadcast weather message (if allowed/available), or a DM fallback
Check:
- No floods; messages obey pacing. No rate‑limit errors in logs
Direct Message: Authentication
REGISTER alice secretPass1
Expect:
- Success message; a welcome/unread summary that fits in one frame
- Prompt changes to
alice (lvl1)>
Check:
- First HELP after login shows a single shortcuts line once:
Shortcuts: M=areas U=user Q=quit
HELP
(compact)
Expect:
- Single‑frame compact help including:
- ACCT:
SETPASS
,CHPASS
,LOGOUT
- MSG navigation hints (
M
topics; digits pick;+
/-
;F
;READ
/POST
/TOPICS
) - OTHER:
WHERE | U | Q
- ACCT:
- Fits in 230 bytes including prompt
HELP+
(verbose)
Expect:
- Multiple DM chunks; prompt appended to the last chunk only
- Detailed sections for navigation, moderator/sysop, legacy commands
SETPASS newPassOnlyIfPasswordless
(only if the account had no password)
Expect:
- Success (or an explanatory message if already set)
CHPASS secretPass1 secretPass2
Expect:
- Success; future logins require the new password on unbound nodes
LOGOUT
then LOGIN alice secretPass2
Expect:
- Login success; prompt is
alice (lvl1)>
- Wrong password attempt yields an error
WHERE
(or W
)
Expect:
- Breadcrumb reporting where you are (Login/Main/Topics/etc)
Compact UI: Topics → Subtopics → Threads → Read
M
(go to Topics)
Expect:
- List of root topics only
- Items with children show a
›
marker - Footer provides short instructions (L more, H help, X exit)
Select a topic with subtopics (press a digit)
Expect:
- Subtopics view listing child topics (with
›
if nested) U
/B
goes up one level;M
returns to root Topics;L
paginates
Select a leaf subtopic (press a digit)
Expect:
- Threads list for that subtopic
- Pinned threads show a
📌
icon - If the topic is locked, header shows
[locked]
- Footer:
Reply: 1-9 read, N new, L more, B back, F <text> filter
(if no filter applied)
N
(create a new thread)
Expect:
- Prompt for title (≤32)
- Then prompt for body (single‑message)
- Return to Threads with your new thread listed (title shown, truncated if needed)
F <text>
(filter) and F
(clear)
Expect:
- Filter narrows visible thread titles;
F
with no text clears L
paginates filtered results if many
1
(read first thread)
Expect:
- Read view shows
[BBS][topic > title] …
and body (truncated for space) - If a reply exists, last reply line preview is shown prefixed with
—
- Footer:
+
next,-
prev,Y
reply,B
back,H
help
Y
(reply), then type a short reply
Expect:
- Return to Read view; your reply is saved and previewed on subsequent displays
+
and -
(navigate between threads)
Expect:
- Moves to next/previous thread; prompt and headers update accordingly
B
(from Read)
Expect:
- Returns to Threads
- Another
B
goes up (Threads → Subtopics; Subtopics → Topics);M
always returns to Topics
X
(exit)
Expect:
- Ends the session (
Goodbye! 73s
) and prompt no longer updates
Legacy inline commands (still supported)
TOPICS
/ LIST
Expect:
- A listing of topics and descriptions (respects read permissions)
READ general
(or another topic)
Expect:
- Lists recent messages from the topic (top N)
- Format:
author | timestamp, content …
with separators
POST general Hello world!
Expect:
- Posted to that topic immediately (unless locked or permission denied)
POST general
(multi‑line)
Expect:
- Instructions for multi‑line; end with a dot on its own line to post
Unknown command (e.g., NOPE
)
Expect:
- Terse reply:
Invalid command "NOPE"
followed by the prompt - Stays within frame limit
Moderator features (level ≥5)
Login as sysop and promote alice
to moderator
As sysop (login as your configured sysop account), then:
PROMOTE alice
- or
G @alice=5
(equivalent)
Expect:
- Confirmation; role changes reflected in subsequent HELP output for
alice
Moderator in Threads: Pin/Unpin, Rename, Lock/Unlock
In Threads list:
P1
(toggle pinned for item 1)R1 New Title
(rename thread title; truncates to 32)K
(toggle lock state for current topic; also tryLOCK
andUNLOCK
explicitly)
Expect:
- Visual changes in list headers:
📌
appears;[locked]
on header when locked - Posting while locked is denied; unlocking restores posting
Delete with confirmation
D1
(delete item 1) → Confirm delete? (Y/N)
Expect:
Y
deletes and returns to Threads;N
cancels- Deletion removes the message and logs to audit
Deletion audit log
DELLOG
(and optionallyDELLOG 2
for page 2)
Expect:
- Entries including timestamp, topic/id, and actor
Admin/sysop dashboards and user admin (level ≥10)
USERS [pattern]
Expect:
- List of users; optional filtering when pattern is provided
USERINFO alice
Expect:
- Detailed info: level, posts, registered date
WHO
/ SESSIONS
Expect:
- Basic summaries (if supported in your build; some are placeholders)
BROADCAST <message>
Expect:
- Broadcast to public; DM fallback possible or admin‑log entry
SYSLOG INFO Hello mesh!
Expect:
- Logged to security/audit log with the indicated level; success reply
ADMIN
or DASHBOARD
Expect:
- Quick metrics snapshot: total users, total messages, moderators, recent registrations, etc.
Permissions/denials
As a regular user (level 1)
Try moderator commands (DELETE
, LOCK/UNLOCK
, DELLOG
) and sysop commands (PROMOTE/DEMOTE
, SYSLOG
, BROADCAST
).
Expect:
- “Permission denied.” for restricted commands; HELP hides these unless authorized
Size and prompt checks (sanity)
DM length checks (visual)
Observe that:
HELP
fits in one frame with prompt- Registration/login banners are concise and never get cut mid‑character
HELP+
: prompt only on last chunk
Persistence checks
Restart BBS
Stop and start the server.
Expect:
- Topics, subtopics, locked states, and messages persist (
data/topics.json
and files underdata/messages/…
) - Users persist; logging back in works with saved password (if set)
Optional: Weather caching sanity
Send ^WEATHER
multiple times
Expect:
- Caching in effect; public broadcast or DM fallback; no spam; pacing respected
Optional: Negative/edge cases
Topic permission checks
Create a topic that requires higher read/post levels, then attempt actions as a lower‑level user.
Expect:
- Topic hidden when below
read_level
; post denied when belowpost_level
Over‑long post content
Try to post a very long message via legacy POST
(simulate >10KB) or with invalid characters.
Expect:
- Error about invalid characters or size limit; no message stored
Invalid usernames on REGISTER
/LOGIN
Expect:
- Clear validation error with guidance; no user created
Operational tips
- Use
WHERE
/W
often for breadcrumb clarity at each level you test - For subtopics, verify multi‑level nesting by creating a child of a child, then navigating up with
B
/U
/M
- For moderator actions, verify that UI hints appear in HELP only when the role is high enough
Source on GitHub: This plan reflects the current implementation documented in the project README and command reference.