From d9b7d471380efcb3f5f44bd3d2935c913671172b Mon Sep 17 00:00:00 2001 From: seungwonme Date: Sat, 4 Jul 2026 22:29:33 +0900 Subject: [PATCH] test(desktop): add e2e smoke and wire swift tests into just test --- .github/workflows/ci.yml | 3 +++ AGENTS.md | 3 ++- README.md | 3 ++- justfile | 7 ++++++- scripts/desktop-e2e.sh | 42 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 55 insertions(+), 3 deletions(-) create mode 100755 scripts/desktop-e2e.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fb36d13..e9348e6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,3 +50,6 @@ jobs: - name: Build run: just build + + - name: Desktop e2e + run: just e2e diff --git a/AGENTS.md b/AGENTS.md index 70741d5..badc141 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,7 +20,8 @@ brew install just # 루트 품질 게이트 (justfile이 태스크 단일 진입점) just lint -just test +just test # Python pytest + Swift 유닛 테스트 +just e2e # desktop e2e 스모크 (fixture DB + 실제 앱 부팅) just build # desktop 앱 빌드 just dev # desktop 앱 실행 diff --git a/README.md b/README.md index fc26c00..6199900 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,8 @@ On macOS, credentials can be stored in Keychain. SQLite keeps only the Keychain ```bash just lint -just test +just test # Python pytest + Swift unit tests +just e2e # desktop e2e smoke (fixture DB + real app boot) just build # desktop app just dev # run desktop app just format diff --git a/justfile b/justfile index 40ee9ce..f05df0b 100644 --- a/justfile +++ b/justfile @@ -12,9 +12,14 @@ lint: uv run flake8 packages tests scripts uv run pylint packages/skim-core/src/skim_core packages/skim-cli/src/skim_cli scripts -# Python 테스트 +# 테스트 (Python + Swift) test: uv run pytest tests -q + swift test --package-path apps/desktop + +# 데스크톱 e2e 스모크 (fixture DB + 실제 앱 부팅) +e2e: + sh scripts/desktop-e2e.sh # 데스크톱 앱 빌드 build: diff --git a/scripts/desktop-e2e.sh b/scripts/desktop-e2e.sh new file mode 100755 index 0000000..541c4c7 --- /dev/null +++ b/scripts/desktop-e2e.sh @@ -0,0 +1,42 @@ +#!/bin/sh +# Desktop e2e smoke: 실제 바이너리를 fixture 워크스페이스로 부팅시켜 검증한다. +# 1) SkimDesktopSmoke가 빈 fixture에 스키마를 만들고 0건을 읽는지 +# 2) sqlite3로 시드한 포스트 1건을 같은 바이너리가 읽어내는지 +# 3) SkimDesktop 앱이 fixture 워크스페이스로 부팅해 죽지 않는지 +set -eu + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +BIN="$(swift build --package-path "$ROOT/apps/desktop" --show-bin-path)" +swift build --package-path "$ROOT/apps/desktop" + +FIXTURE="$(mktemp -d)" +APP_PID="" +cleanup() { + [ -n "$APP_PID" ] && kill "$APP_PID" 2>/dev/null || true + [ -n "$FIXTURE" ] && /bin/rm -rf -- "$FIXTURE" +} +trap cleanup EXIT + +export SKIM_WORKSPACE_ROOT="$FIXTURE" +mkdir -p "$FIXTURE/data" + +echo "== smoke: empty fixture ==" +"$BIN/SkimDesktopSmoke" | tee /dev/stderr | grep -q "recent_posts=0" + +echo "== seed one post ==" +sqlite3 "$FIXTURE/data/skim.db" "INSERT INTO posts (platform, external_id, author, title, content, content_markdown, url, timestamp) +VALUES ('hackernews', 'e2e-1', 'e2e', 'E2E fixture post', 'body', '# E2E fixture post', 'https://example.com', datetime('now'));" + +echo "== smoke: seeded fixture ==" +"$BIN/SkimDesktopSmoke" | tee /dev/stderr | grep -q "recent_posts=1" + +echo "== app boot ==" +"$BIN/SkimDesktop" & +APP_PID=$! +sleep 5 +kill -0 "$APP_PID" || { echo "FAIL: SkimDesktop exited within 5s"; exit 1; } +kill "$APP_PID" +wait "$APP_PID" 2>/dev/null || true +APP_PID="" + +echo "OK: desktop e2e passed"