test: divi-library smoke hygiene (M-14)

Per-run editor login and role, deleted only when this run created them (and
refused when they exist); the allowed-roles option is deleted again when it
was absent; the run-token fallback covers pages too; readOnlyHint must be
false, not just missing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-27 04:25:53 +02:00
co-authored by Claude Opus 5.5
parent dcbd52e51d
commit 25446d292d
+32 -11
View File
@@ -13,15 +13,26 @@ cd /var/www/html
source wp-content/plugins/WP-LIT-MCP/tests/Integration/lib.sh
ADMIN_LOGIN=$(wp user list --role=administrator --field=user_login | head -1)
EDITOR_LOGIN=lit-lib-editor
EDITOR_ROLE=lit_lib_editor
STAGE3=$PLUGIN/tests/Fixtures/divi/stage3
RUN="$(date +%s)-$$"
PREFIX="LIT Smoke $RUN"
ORIGINAL_ROLES=$(wp option get lit_mcp_allowed_roles --format=json 2>/dev/null || echo '["administrator"]')
# Per-run names: cleanup never touches an account or role that existed before this run.
EDITOR_LOGIN="lit-lib-editor-$RUN"
EDITOR_ROLE="lit_lib_editor_${RUN//-/_}"
EDITOR_CREATED=0
ROLE_CREATED=0
ORIGINAL_ROLES=$(wp option get lit_mcp_allowed_roles --format=json 2>/dev/null || echo '__none__')
ORIGINAL_EXPOSURE=$(wp option get lit_mcp_exposure --format=json 2>/dev/null || echo '__none__')
CREATED_POSTS=()
restore_roles() {
if [ "$ORIGINAL_ROLES" = "__none__" ]; then
wp option delete lit_mcp_allowed_roles >/dev/null 2>&1 || true
else
wp option update lit_mcp_allowed_roles "$ORIGINAL_ROLES" --format=json >/dev/null 2>&1 || true
fi
}
restore_exposure() {
if [ "$ORIGINAL_EXPOSURE" = "__none__" ]; then
wp option delete lit_mcp_exposure >/dev/null 2>&1 || true
@@ -31,12 +42,13 @@ restore_exposure() {
}
cleanup() {
# Library entries of this run whose ID a stopped run could not record (title prefix with the run token).
# Pages and library entries of this run whose ID a stopped run could not record (title prefix with the run token).
local found
found=$(LIT_PREFIX="$PREFIX " wp eval '
global $wpdb;
echo implode(" ", $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM $wpdb->posts WHERE post_type = %s AND post_title LIKE %s",
"SELECT ID FROM $wpdb->posts WHERE post_type IN (%s, %s) AND post_title LIKE %s",
"page",
"et_pb_layout",
$wpdb->esc_like((string) getenv("LIT_PREFIX")) . "%"
)));' 2>/dev/null || true)
@@ -59,10 +71,14 @@ foreach (array_unique(array_filter(explode(" ", (string) getenv("LIT_IDS")))) as
wp post delete "$id" --force >/dev/null 2>&1 || true
done
cleanup_app_passwords_for "$ADMIN_LOGIN"
cleanup_app_passwords_for "$EDITOR_LOGIN"
wp user delete "$EDITOR_LOGIN" --yes >/dev/null 2>&1 || true
wp role delete "$EDITOR_ROLE" >/dev/null 2>&1 || true
wp option update lit_mcp_allowed_roles "$ORIGINAL_ROLES" --format=json >/dev/null 2>&1 || true
if [ "$EDITOR_CREATED" = 1 ]; then
cleanup_app_passwords_for "$EDITOR_LOGIN"
wp user delete "$EDITOR_LOGIN" --yes >/dev/null 2>&1 || true
fi
if [ "$ROLE_CREATED" = 1 ]; then
wp role delete "$EDITOR_ROLE" >/dev/null 2>&1 || true
fi
restore_roles
restore_exposure
}
trap 'rc=$?; cleanup; guard_exit "$rc" || exit $?' EXIT
@@ -161,7 +177,7 @@ connect "$ADMIN_LOGIN"
# 1. Exposure: lit-library-insert direct, the other new tools indirect, 22 direct lit tools
LIST=$(rpc tools/list '{}')
echo "$LIST" | jq -e '.result.tools[] | select(.name == "lit-library-insert") | .annotations.readOnlyHint != true' >/dev/null \
echo "$LIST" | jq -e '.result.tools[] | select(.name == "lit-library-insert") | .annotations.readOnlyHint == false' >/dev/null \
|| fail "lit-library-insert is not a direct write tool"
for t in lit-library-list lit-library-save lit-divi-node-copy lit-divi-dynamic-sources; do
if echo "$LIST" | jq -e --arg t "$t" '.result.tools[] | select(.name == $t)' >/dev/null; then fail "$t must be indirect"; fi
@@ -368,10 +384,15 @@ done
pass "admin (unfiltered_html) may save interactions, Lottie source and custom HTML to the library"
# 10. Temporary editor without unfiltered_html and without edit_private_pages
if wp user get "$EDITOR_LOGIN" >/dev/null 2>&1 || wp role exists "$EDITOR_ROLE" >/dev/null 2>&1; then
fail "user $EDITOR_LOGIN or role $EDITOR_ROLE exists already"
fi
wp role create "$EDITOR_ROLE" "LIT Smoke Bibliothek" --clone=editor >/dev/null
ROLE_CREATED=1
wp cap remove "$EDITOR_ROLE" unfiltered_html edit_private_pages >/dev/null
wp option update lit_mcp_allowed_roles "[\"administrator\",\"$EDITOR_ROLE\"]" --format=json >/dev/null
wp user create "$EDITOR_LOGIN" lit-lib-editor@example.invalid --role="$EDITOR_ROLE" >/dev/null
wp user create "$EDITOR_LOGIN" "$EDITOR_LOGIN@example.invalid" --role="$EDITOR_ROLE" >/dev/null
EDITOR_CREATED=1
[ "$(LIT_LOGIN="$EDITOR_LOGIN" LIT_ID="$PRIVATE_ID" wp eval '
$u = get_user_by("login", getenv("LIT_LOGIN"));
echo (user_can($u, "unfiltered_html") ? "html " : "") . (user_can($u, "edit_post", (int) getenv("LIT_ID")) ? "private" : "");')" = "" ] \