#!/usr/bin/env bash # End-to-end test driver: builds the plugin, provisions an isolated Obsidian # vault + config with the plugin installed and enabled, then runs the Playwright # spec against the real Obsidian binary under a virtual X display. set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT" CACHE="${OBSIDIAN_CACHE:-$HOME/.cache/obsidian-e2e}" APPIMAGE="$CACHE/Obsidian.AppImage" SQUASHFS="$CACHE/squashfs-root" E2E_DIR="$ROOT/.obsidian-e2e" VAULT="$E2E_DIR/vault" CONFIG_HOME="$E2E_DIR/config" if [[ ! -f "$APPIMAGE" ]]; then echo "Obsidian AppImage not found at $APPIMAGE." >&2 echo "Download it from https://obsidian.md/download and place it there." >&2 exit 1 fi # Extract the AppImage once so we can launch the inner Electron binary directly. if [[ ! -x "$SQUASHFS/obsidian" ]]; then echo "==> Extracting Obsidian AppImage" ( cd "$CACHE" && "$APPIMAGE" --appimage-extract >/dev/null ) fi export OBSIDIAN_BIN="$SQUASHFS/obsidian" echo "==> Building plugin" npm run build >/dev/null echo "==> Provisioning isolated vault + config at $E2E_DIR" rm -rf "$E2E_DIR" PLUGIN_DIR="$VAULT/.obsidian/plugins/jekyll-publish" mkdir -p "$PLUGIN_DIR" "$CONFIG_HOME/obsidian" cp dist/main.js dist/manifest.json dist/styles.css "$PLUGIN_DIR/" # Enable our community plugin (and disable Obsidian's first-run restricted mode prompt). printf '["jekyll-publish"]\n' > "$VAULT/.obsidian/community-plugins.json" # Create a test note so the publish command has an active file. cat > "$VAULT/Test.md" <<'MD' --- title: E2E Test Post date: 2024-01-01 --- # E2E Test Post This is a test note for the E2E smoke test. MD # Register the vault and mark it open so Obsidian boots straight into it. VAULT_ESCAPED=$(printf '%s' "$VAULT" | sed 's/[\/&]/\\&/g') cat > "$CONFIG_HOME/obsidian/obsidian.json" < Running Playwright (xvfb + real Obsidian)" xvfb-run -a --server-args="-screen 0 1280x900x24" npx playwright test "$@"