Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
118a0db
feat(e2e): chat tool-call lifecycle specs (T1, T2, T3)
YellowSnnowmann May 19, 2026
c946207
feat(e2e): user journey specs — full task + settings round-trip + con…
YellowSnnowmann May 19, 2026
87805b3
feat(e2e): navigation smoothness + settings panels specs
YellowSnnowmann May 19, 2026
a20a8b6
feat(e2e): register new specs in e2e-run-all-flows.sh
YellowSnnowmann May 19, 2026
d53ac6d
fix(core): test_reset clears onboarding_completed flag and fixes edge…
YellowSnnowmann May 20, 2026
8faa372
fix(e2e): restore onboarding_completed=true after test_reset to unblo…
YellowSnnowmann May 20, 2026
2f44021
feat(app): add data-testid selectors for accounts E2E specs; fix thre…
YellowSnnowmann May 20, 2026
5e62151
feat(e2e): expand shared-flows helpers and align mock-api with curren…
YellowSnnowmann May 20, 2026
3da9b1b
feat(e2e): rewrite orchestrator with full 66-spec suite, --suite/--ba…
YellowSnnowmann May 20, 2026
d7ab5c6
fix(e2e): correct stale settings routes and removed element references
YellowSnnowmann May 20, 2026
62c1544
fix(e2e): harden auth timing, waitUntil polling, and spec-level reset…
YellowSnnowmann May 20, 2026
c7ae164
fix(e2e): use native OS keyboard events in typeIntoComposer to update…
YellowSnnowmann May 20, 2026
aa68eac
fix(e2e): use WebDriver Actions API for command palette key dispatch …
YellowSnnowmann May 20, 2026
baa63fe
ci(e2e): add artifact upload and job summary steps to reusable E2E wo…
YellowSnnowmann May 20, 2026
5450f4d
feat(e2e): new specs and pre-flight tooling for accounts provider picker
YellowSnnowmann May 20, 2026
ccbd6e0
fix(e2e): gate chat sends on socketStatus=connected + fix clickSend f…
YellowSnnowmann May 20, 2026
bbd586d
fix(socket): align selectSocketUserId with socketService userId key
YellowSnnowmann May 20, 2026
613bcfa
refactor(e2e): clean up imports and improve code formatting across mu…
YellowSnnowmann May 20, 2026
0566e34
fix(e2e): remove unused variables flagged by lint
YellowSnnowmann May 20, 2026
5bdda6f
refactor(e2e): remove unnecessary whitespace in chat-harness and comp…
YellowSnnowmann May 20, 2026
c84825d
fix(test): align socket selector tests with auth.userId refactor and …
YellowSnnowmann May 20, 2026
944dde3
Update Product Hunt badges in README
senamakel May 21, 2026
fdff9ff
refactor(e2e): overhaul E2E specs with improved helpers, shared flows…
YellowSnnowmann May 21, 2026
1a49ab6
Merge remote-tracking branch 'upstream/main' into fix/e2e-v2
YellowSnnowmann May 21, 2026
74c90ef
fix(e2e): remove unreachable sidebar fallback after merge conflict re…
YellowSnnowmann May 21, 2026
e5ab4c2
feat(wallet): register wallet Tool trait implementations for crypto s…
YellowSnnowmann May 22, 2026
80e0412
fix(agent): emit SubagentSpawned to per-request progress sink in disp…
YellowSnnowmann May 22, 2026
1184b44
fix(auth): poll for currentUser before navigating after deep-link login
YellowSnnowmann May 22, 2026
f53b9be
fix(e2e): improve shared-flows helpers for reliability
YellowSnnowmann May 22, 2026
7b715a3
fix(e2e): migrate notifications, card-payment, whatsapp specs to rese…
YellowSnnowmann May 22, 2026
2f51e85
fix(e2e): increase Send button timeout and add diagnostics in chat-ha…
YellowSnnowmann May 22, 2026
35ee961
fix(e2e): rewrite conversations-web-channel-flow for agent pipeline
YellowSnnowmann May 22, 2026
b59b339
fix(e2e): add explicit cron job seeding and text-based button clicks
YellowSnnowmann May 22, 2026
dee0943
fix(e2e): make wallet quote assertion graceful and reduce LLM hit thr…
YellowSnnowmann May 22, 2026
5ddf9fa
fix(e2e): fix logout-relogin timeout and use bypass auth for re-login
YellowSnnowmann May 22, 2026
b3b658d
fix(e2e): add layout check and retry for Custom card click in onboard…
YellowSnnowmann May 22, 2026
4c025df
fix(e2e): add timeout and home fallback to navigation spec
YellowSnnowmann May 22, 2026
4fa8e80
style(wallet): alphabetize mod declarations and pub use exports
YellowSnnowmann May 22, 2026
36de8a5
style(e2e): apply prettier formatting to logout-relogin spec
YellowSnnowmann May 22, 2026
80189ec
style(e2e): clean up import statements and format code in test specs
YellowSnnowmann May 22, 2026
3c6157b
fix(e2e): remove unused functions in cron-jobs-flow spec
YellowSnnowmann May 22, 2026
e1ad4fb
Merge remote-tracking branch 'upstream/main' into fix/e2e-v2
YellowSnnowmann May 22, 2026
09a8b94
fix(i18n): add missing German translations for MCP server and subcons…
YellowSnnowmann May 22, 2026
2b25033
fix: address CodeRabbit review feedback
YellowSnnowmann May 22, 2026
36a57ba
fix(wallet): use Debug format for WalletChain in prepare_transfer log…
YellowSnnowmann May 22, 2026
26ee16c
fix: additional CodeRabbit feedback — cd guard, preflight check, noti…
YellowSnnowmann May 22, 2026
65d0bea
Merge branch 'main' into fix/e2e-v2
YellowSnnowmann May 22, 2026
e51c1d0
fix(wallet): redact address and amount in prepare_transfer debug logs
YellowSnnowmann May 22, 2026
9ed5792
fix(i18n): remove duplicate MCP server keys in German locale chunk
YellowSnnowmann May 22, 2026
9c905ed
fix(e2e): correct /settings/intelligence route to /intelligence
YellowSnnowmann May 22, 2026
64619d4
fix(e2e): fix agent chat draft persistence and restore conversations …
YellowSnnowmann May 22, 2026
df0f507
fix(socket): handle stale disconnected socket instances to ensure fre…
YellowSnnowmann May 22, 2026
de320e3
test(socket): add unit test for stale disconnected socket cleanup
YellowSnnowmann May 22, 2026
69e4afa
fix(e2e): enhance chat conversation history and cron jobs flow tests
YellowSnnowmann May 22, 2026
cb0acc6
Merge branch 'main' of github.com:senamakel/openhuman
senamakel May 22, 2026
bf243a2
Merge branch 'main' into pr/2353
senamakel May 22, 2026
361806f
fix(e2e): scope socket/auth readiness to active user, extend stream t…
senamakel May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 29 additions & 8 deletions .github/workflows/e2e-reusable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -150,16 +150,37 @@ jobs:

- name: Run E2E (full suite)
if: ${{ inputs.full }}
env:
E2E_BAIL_ON_FAILURE: ${{ vars.E2E_BAIL_ON_FAILURE || '' }}
run: |
BAIL_FLAG=""
if [[ "${E2E_BAIL_ON_FAILURE:-}" == "1" ]]; then
BAIL_FLAG="--bail"
fi
xvfb-run -a --server-args="-screen 0 1280x960x24" \
bash app/scripts/e2e-run-session.sh

# Artifact uploads intentionally omitted — this reusable workflow
# is invoked from release-staging.yml and release-production.yml,
# and uploaded logs can carry mock-backend payloads, env-var
# echoes, and CDP transcripts that we don't want pinned to a
# release artifact. Local repro: rerun the spec via Docker and
# the same logs land in /tmp.
bash app/scripts/e2e-run-all-flows.sh --skip-preflight $BAIL_FLAG

- name: Upload E2E failure artifacts
if: failure()
uses: actions/upload-artifact@v5
with:
Comment thread
coderabbitai[bot] marked this conversation as resolved.
name: e2e-failure-logs-${{ runner.os }}-${{ github.run_id }}
path: |
/tmp/openhuman-e2e-app-*.log
app/test/e2e/artifacts/
retention-days: 7
if-no-files-found: ignore

- name: Write job summary
if: always()
run: |
echo "## E2E Results (${{ runner.os }})" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [ -f /tmp/e2e-summary.txt ]; then
cat /tmp/e2e-summary.txt >> $GITHUB_STEP_SUMMARY
else
echo "No summary file found." >> $GITHUB_STEP_SUMMARY
fi

# Rust-side E2E counterpart to the Tauri runs above. Same Linux-only
# scope (CI does not run this on macOS or Windows — the Rust core is
Expand Down
195 changes: 195 additions & 0 deletions app/scripts/e2e-preflight.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
#!/usr/bin/env bash
#
# e2e-preflight.sh — Pre-flight environment validation for the E2E test suite.
#
# Checks:
# 1. The E2E app binary/bundle exists for the current platform.
# 2. Node.js and pnpm are available.
# 3. Appium is installed (and the chromium driver is registered).
# 4. Ports 19222, 4723, and 18473 are not blocked by stale processes.
#
# Exits 0 if all hard requirements are met.
# Exits 1 if any hard requirement is missing.
# Warnings are printed for soft issues (occupied ports, missing chromium driver)
# but do not fail the script.
#
set -uo pipefail

# ---------------------------------------------------------------------------
# Color helpers — only when stdout is a terminal.
# ---------------------------------------------------------------------------
if [ -t 1 ]; then
RED='\033[0;31m'
YELLOW='\033[1;33m'
GREEN='\033[0;32m'
BOLD='\033[1m'
RESET='\033[0m'
else
RED='' YELLOW='' GREEN='' BOLD='' RESET=''
fi

info() { printf "%b[preflight]%b %s\n" "$BOLD" "$RESET" "$*"; }
ok() { printf "%b[preflight] ✓%b %s\n" "$GREEN" "$RESET" "$*"; }
warn() { printf "%b[preflight] ⚠%b %s\n" "$YELLOW" "$RESET" "$*" >&2; }
fail() { printf "%b[preflight] ✗%b %s\n" "$RED" "$RESET" "$*" >&2; }

ERRORS=0
_fail() { fail "$*"; (( ERRORS++ )) || true; }

APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"

info "Starting E2E pre-flight checks..."
echo ""

# ---------------------------------------------------------------------------
# 1. App binary / bundle
# ---------------------------------------------------------------------------
info "Checking E2E app bundle..."

PLATFORM="$(uname -s)"
BINARY_FOUND=0
BINARY_PATH=""

case "$PLATFORM" in
Darwin)
MACOS_BUNDLE="$APP_DIR/src-tauri/target/debug/bundle/macos/OpenHuman.app"
if [[ -d "$MACOS_BUNDLE" ]]; then
BINARY_FOUND=1
BINARY_PATH="$MACOS_BUNDLE"
fi
;;
Linux)
LINUX_BIN="$APP_DIR/src-tauri/target/debug/openhuman"
LINUX_DEB="$APP_DIR/src-tauri/target/debug/bundle/deb"
if [[ -f "$LINUX_BIN" ]]; then
BINARY_FOUND=1
BINARY_PATH="$LINUX_BIN"
elif [[ -d "$LINUX_DEB" ]]; then
BINARY_FOUND=1
BINARY_PATH="$LINUX_DEB"
fi
;;
MINGW*|MSYS*|CYGWIN*|Windows*)
WIN_BIN="$APP_DIR/src-tauri/target/debug/openhuman.exe"
if [[ -f "$WIN_BIN" ]]; then
BINARY_FOUND=1
BINARY_PATH="$WIN_BIN"
fi
;;
*)
warn "Unknown platform '$PLATFORM' — cannot verify app bundle path."
BINARY_FOUND=1 # don't block on unknown platforms
;;
esac

if [[ $BINARY_FOUND -eq 1 ]]; then
ok "App bundle found: $BINARY_PATH"
else
_fail "E2E build not found for $PLATFORM."
case "$PLATFORM" in
Darwin)
fail " Expected: $MACOS_BUNDLE"
;;
Linux)
fail " Expected: $LINUX_BIN"
;;
MINGW*|MSYS*|CYGWIN*)
fail " Expected: $WIN_BIN"
;;
esac
fail " Run: pnpm --filter openhuman-app test:e2e:build"
fi

echo ""

# ---------------------------------------------------------------------------
# 2. Node.js + pnpm
# ---------------------------------------------------------------------------
info "Checking Node.js and pnpm..."

if command -v node >/dev/null 2>&1; then
NODE_VERSION="$(node --version 2>/dev/null || echo 'unknown')"
ok "node found: $NODE_VERSION"
else
_fail "node not found. Node.js is required to run WDIO."
fi

if command -v pnpm >/dev/null 2>&1; then
PNPM_VERSION="$(pnpm --version 2>/dev/null || echo 'unknown')"
ok "pnpm found: $PNPM_VERSION"
else
_fail "pnpm not found. Install via: npm install -g pnpm"
fi

echo ""

# ---------------------------------------------------------------------------
# 3. Appium + chromium driver
# ---------------------------------------------------------------------------
info "Checking Appium..."

if command -v appium >/dev/null 2>&1; then
APPIUM_VERSION="$(appium --version 2>/dev/null || echo 'unknown')"
ok "appium found: $APPIUM_VERSION"

# Check for the chromium driver — warn only (e2e-run-session.sh handles this)
CHROMIUM_INSTALLED=0
if appium driver list --installed 2>&1 | grep -qi "chromium"; then
CHROMIUM_INSTALLED=1
ok "Appium chromium driver is installed"
fi
if [[ $CHROMIUM_INSTALLED -eq 0 ]]; then
warn "Appium chromium driver not found in 'appium driver list --installed'."
warn " To install: appium driver install --source=npm appium-chromium-driver"
warn " (e2e-run-session.sh will attempt idempotent install at runtime.)"
fi
else
_fail "Appium not found."
fail " Install: npm install -g appium@3"
fail " Then: appium driver install --source=npm appium-chromium-driver"
fi

echo ""

# ---------------------------------------------------------------------------
# 4. Port availability (warnings only — stale processes are soft blockers)
# ---------------------------------------------------------------------------
info "Checking port availability..."

_check_port() {
local port="$1"
local label="$2"
local pid=""
# Try lsof first (macOS/Linux), fall back to ss (Linux only)
if command -v lsof >/dev/null 2>&1; then
pid=$(lsof -ti tcp:"$port" 2>/dev/null | head -1 || true)
elif command -v ss >/dev/null 2>&1; then
pid=$(ss -tlnp "sport = :$port" 2>/dev/null | awk 'NR>1 {match($NF,/pid=([0-9]+)/,a); print a[1]}' | head -1 || true)
fi

if [[ -n "$pid" ]]; then
warn "Port $port ($label) is occupied by PID $pid."
warn " If this is a stale process from a prior run, kill it:"
warn " kill $pid"
else
ok "Port $port ($label) is free"
fi
}

_check_port 19222 "CEF CDP"
_check_port 4723 "Appium"
_check_port 18473 "mock backend (can be pre-running — OK if deliberate)"

echo ""

# ---------------------------------------------------------------------------
# Summary
# ---------------------------------------------------------------------------
if [[ $ERRORS -gt 0 ]]; then
printf "%b[preflight] PRE-FLIGHT FAILED%b — %d error(s) above must be resolved before running E2E tests.\n" \
"$RED" "$RESET" "$ERRORS" >&2
exit 1
fi

printf "%b[preflight] Pre-flight passed%b — environment looks good.\n" "$GREEN" "$RESET"
exit 0
Loading
Loading