diff --git a/tests/Integration/divi-library-smoke.sh b/tests/Integration/divi-library-smoke.sh index 73c65c8..3a6f806 100755 --- a/tests/Integration/divi-library-smoke.sh +++ b/tests/Integration/divi-library-smoke.sh @@ -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" : "");')" = "" ] \