From 4ab46fe700bf67339408712b2dca1d818ab856c0 Mon Sep 17 00:00:00 2001 From: Drew Ritter Date: Thu, 2 Jul 2026 14:09:14 -0700 Subject: [PATCH] test(writing-skills): cover render-graphs execution --- skills/writing-skills/render-graphs.js | 6 +- tests/writing-skills/test-render-graphs.sh | 113 +++++++++++++++++++++ 2 files changed, 116 insertions(+), 3 deletions(-) create mode 100755 tests/writing-skills/test-render-graphs.sh diff --git a/skills/writing-skills/render-graphs.js b/skills/writing-skills/render-graphs.js index 14988965..59e74b54 100755 --- a/skills/writing-skills/render-graphs.js +++ b/skills/writing-skills/render-graphs.js @@ -13,9 +13,9 @@ * Requires: graphviz (dot) installed on system */ -const fs = require('fs'); -const path = require('path'); -const { execFileSync } = require('child_process'); +import * as fs from 'fs'; +import * as path from 'path'; +import { execFileSync } from 'child_process'; function extractDotBlocks(markdown) { const blocks = []; diff --git a/tests/writing-skills/test-render-graphs.sh b/tests/writing-skills/test-render-graphs.sh new file mode 100755 index 00000000..349cd47e --- /dev/null +++ b/tests/writing-skills/test-render-graphs.sh @@ -0,0 +1,113 @@ +#!/usr/bin/env bash +set -u + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +SCRIPT_UNDER_TEST="$REPO_ROOT/skills/writing-skills/render-graphs.js" +NODE_BIN="$(command -v node)" + +PASSES=0 +FAILURES=0 +TEST_ROOT="$(mktemp -d)" + +cleanup() { + rm -rf "$TEST_ROOT" +} +trap cleanup EXIT + +pass() { + echo " [PASS] $1" + PASSES=$((PASSES + 1)) +} + +fail() { + echo " [FAIL] $1" + FAILURES=$((FAILURES + 1)) +} + +assert_contains() { + local haystack="$1" + local needle="$2" + local description="$3" + + if printf '%s' "$haystack" | grep -Fq -- "$needle"; then + pass "$description" + else + fail "$description" + echo " expected to find: $needle" + fi +} + +assert_not_contains() { + local haystack="$1" + local needle="$2" + local description="$3" + + if printf '%s' "$haystack" | grep -Fq -- "$needle"; then + fail "$description" + echo " did not expect to find: $needle" + else + pass "$description" + fi +} + +fixture="$TEST_ROOT/fixture-skill" +mkdir -p "$fixture" "$TEST_ROOT/empty-path" +cat >"$fixture/SKILL.md" <<'EOF' +--- +name: fixture-skill +--- + +# Fixture Skill + +```dot +digraph fixture_graph { + start -> end; +} +``` +EOF + +echo "Writing-skills render-graphs tests" + +missing_dot_output="$(PATH="$TEST_ROOT/empty-path" "$NODE_BIN" "$SCRIPT_UNDER_TEST" "$fixture" 2>&1)" +missing_dot_status=$? + +if [[ "$missing_dot_status" -ne 0 ]]; then + pass "missing Graphviz exits non-zero" +else + fail "missing Graphviz exits non-zero" +fi +assert_contains "$missing_dot_output" "Error: graphviz (dot) not found." "missing Graphviz reports install guidance" +assert_not_contains "$missing_dot_output" "ReferenceError: require is not defined" "script runs as an ES module" + +render_output="$("$NODE_BIN" "$SCRIPT_UNDER_TEST" "$fixture" 2>&1)" +render_status=$? + +if [[ "$render_status" -eq 0 ]]; then + pass "fixture diagram renders" +else + fail "fixture diagram renders" + printf '%s\n' "$render_output" +fi + +assert_contains "$render_output" "Found 1 diagram(s)" "reports discovered diagram" +assert_contains "$render_output" "Rendered: fixture_graph.svg" "reports rendered SVG" + +if [[ -f "$fixture/diagrams/fixture_graph.svg" ]]; then + pass "writes SVG output" +else + fail "writes SVG output" +fi + +if [[ -f "$fixture/diagrams/fixture_graph.svg" ]] && grep -Fq "