diff --git a/tests/test_importer_detect_changes.sh b/tests/test_importer_detect_changes.sh new file mode 100644 index 0000000..061797d --- /dev/null +++ b/tests/test_importer_detect_changes.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +set -euo pipefail + +# tests/test_importer_detect_changes.sh +# Prüft Änderungserkennung: +# - Body-Change -> wird erkannt bei hash-mode=body +# - Frontmatter-Change -> wird NICHT erkannt bei hash-mode=body +# - Frontmatter-Change -> wird erkannt bei hash-mode=frontmatter (bzw. MINDNET_HASH_COMPARE=Frontmatter) +# +# Aufruf: +# ./tests/test_importer_detect_changes.sh [--vault ./test_vault] [--prefix mindnet] [--note-id concept-alpha] + +VAULT="./test_vault" +PREFIX="${COLLECTION_PREFIX:-mindnet}" +NOTE_ID="concept-alpha" +while [[ $# -gt 0 ]]; do + case "$1" in + --vault) VAULT="$2"; shift 2;; + --prefix) PREFIX="$2"; shift 2;; + --note-id) NOTE_ID="$2"; shift 2;; + *) echo "Unbekannte Option: $1" >&2; exit 2;; + esac +done +export COLLECTION_PREFIX="$PREFIX" + +# Hilfsfunktion: lese Pfad zur Note aus Frontmatter id: +PYFIND=$(cat <<'PY' +import sys, os, glob, yaml +vault = sys.argv[1] +nid = sys.argv[2] +for p in glob.glob(os.path.join(vault, "**", "*.md"), recursive=True): + with open(p, "r", encoding="utf-8") as f: + s = f.read() + if s.startswith("---"): + try: + fm_txt, body = s.split("\n---\n", 1) + fm = yaml.safe_load(fm_txt.strip("- \n")) or {} + except Exception: + continue + if fm.get("id") == nid: + print(p) + break +PY +) +NOTE_PATH=$(python3 -c "$PYFIND" "$VAULT" "$NOTE_ID") +if [[ -z "${NOTE_PATH:-}" ]]; then + echo "Note mit id=$NOTE_ID nicht gefunden im Vault=$VAULT" >&2 + exit 3 +fi +echo "Note: $NOTE_PATH" + +# Backup +ORIG="$(mktemp)" +cp "$NOTE_PATH" "$ORIG" + +cleanup() { + cp "$ORIG" "$NOTE_PATH" || true + rm -f "$ORIG" +} +trap cleanup EXIT + +# Ausgangszustand importieren (Baseline) +python3 -m scripts.import_markdown --vault "$VAULT" --apply --prefix "$PREFIX" >/dev/null + +echo "-- Test A: Body-Änderung soll erkannt werden (hash-mode=body)" +# Body um eine Zeile erweitern +python3 - "$NOTE_PATH" <<'PY' +import sys +p=sys.argv[1] +with open(p,"r+",encoding="utf-8") as f: + s=f.read() + if s.startswith("---"): + fm, body = s.split("\n---\n",1) + body = body + "\n\nBodyTest: Änderung A" + f.seek(0); f.truncate(); f.write(fm+"\n---\n"+body) +PY +OUT=$(python3 -m scripts.import_markdown --vault "$VAULT" --prefix "$PREFIX" | grep "\"note_id\": \"$NOTE_ID\"" || true) +echo "$OUT" +echo "$OUT" | grep -q '"changed": true' || { echo "ERWARTET: changed=true (Body) — FEHLER"; exit 4; } + +echo "-- Test B: Frontmatter-Änderung soll NICHT erkannt werden bei mode=body" +# Frontmatter-Feld hinzufügen +python3 - "$NOTE_PATH" <<'PY' +import sys, yaml, io +p=sys.argv[1] +with open(p,"r+",encoding="utf-8") as f: + s=f.read() + if s.startswith("---"): + fm_txt, body = s.split("\n---\n",1) + fm = yaml.safe_load(fm_txt.strip("- \n")) or {} + fm["test_flag"] = True + buf = io.StringIO() + yaml.safe_dump(fm, buf, allow_unicode=True, sort_keys=False) + f.seek(0); f.truncate(); f.write("---\n"+buf.getvalue()+"---\n"+body) +PY +OUT=$(python3 -m scripts.import_markdown --vault "$VAULT" --prefix "$PREFIX" | grep "\"note_id\": \"$NOTE_ID\"" || true) +echo "$OUT" +echo "$OUT" | grep -q '"changed": false' || { echo "ERWARTET: changed=false (FM bei mode=body) — FEHLER"; exit 5; } + +echo "-- Test C: Frontmatter-Änderung soll erkannt werden bei mode=frontmatter" +OUT=$(MINDNET_HASH_COMPARE=Frontmatter python3 -m scripts.import_markdown --vault "$VAULT" --prefix "$PREFIX" | grep "\"note_id\": \"$NOTE_ID\"" || true) +echo "$OUT" +echo "$OUT" | grep -q '"changed": true' || { echo "ERWARTET: changed=true (FM bei mode=frontmatter) — FEHLER"; exit 6; } + +echo "✔ Änderungserkennung: OK"