un-inception/Makefile
russell@unturf.com 8695578d89 feat: add smart multi-language testing strategy for client SDK growth
Add comprehensive testing infrastructure for UN clients:

1. Smart Change Detection (detect-changes.sh)
   - Detects changes in BOTH root-level (un.py, un.go) AND clients/ directory
   - Maps file extensions and directory names to languages
   - Triggers test_all when infrastructure changes

2. Language-Specific CI Matrix (generate-matrix.sh compatible)
   - Only runs tests for languages with changes
   - Example: modify clients/python/ → pytest runs, Go/Ruby skipped

3. Testing Strategy Document (TESTING-STRATEGY.md)
   - Complete testing matrix by language tier (compiled, interpreted, inception)
   - Unit, integration, embedding, and parity tests
   - Inception pattern for languages without local interpreters
   - Common failures and fixes
   - Rollout schedule for client/ migration

4. Makefile Targets
   - 'make test-python', 'make test-go', etc. for local development
   - 'make test-all' for comprehensive testing
   - 'make test-integration' for API contract validation
   - 'make test-ci-locally' to simulate CI pipeline

5. Updated CLAUDE.md
   - Documents SDK architecture (in growth state)
   - Explains three purposes: CLI, library, embeddable
   - References TESTING-STRATEGY.md for details

This enables:
✓ Per-language testing (only run what changed)
✓ Local developer workflow (make test-LANG)
✓ 42+ language feature parity validation
✓ Cross-language integration testing
2026-01-15 15:52:40 -05:00

211 lines
6.1 KiB
Makefile

.PHONY: help test test-all test-python test-go test-javascript test-ruby test-php test-rust test-java test-bash test-perl test-lua
help:
@echo "UN Inception Testing Targets"
@echo ""
@echo "Usage: make [target]"
@echo ""
@echo "Test Targets:"
@echo " test-all Run all available tests"
@echo " test-python Test Python client (un.py)"
@echo " test-go Test Go client (un.go)"
@echo " test-javascript Test JavaScript client (un.js)"
@echo " test-ruby Test Ruby client (un.rb)"
@echo " test-php Test PHP client (un.php)"
@echo " test-rust Test Rust client (un.rs)"
@echo " test-java Test Java client (Un.java)"
@echo " test-bash Test Bash client (un.sh)"
@echo " test-perl Test Perl client (un.pl)"
@echo " test-lua Test Lua client (un.lua)"
@echo ""
@echo "Integration Tests:"
@echo " test-integration Test all clients against API"
@echo ""
@echo "Examples:"
@echo " make test-python # Test only Python"
@echo " make test-all # Test everything"
@echo ""
test: test-all
test-all:
@echo "Running all available tests..."
./tests/run_all_tests.sh
test-python:
@echo "Testing Python client (clients/python/un.py)..."
@if [ -f clients/python/un.py ]; then \
python3 -m py_compile clients/python/un.py && \
python3 clients/python/un.py test/fib.py && \
[ -f tests/test_un_py.py ] && pytest tests/test_un_py.py -v || true; \
elif [ -f un.py ]; then \
python3 -m py_compile un.py && \
python3 un.py test/fib.py && \
[ -f tests/test_un_py.py ] && pytest tests/test_un_py.py -v || true; \
else \
echo "ERROR: Python client not found"; \
exit 1; \
fi
test-go:
@echo "Testing Go client (clients/go/un.go)..."
@if [ -d clients/go ]; then \
cd clients/go && \
go mod tidy 2>/dev/null || true && \
go test -v && \
go run un.go ../../test/fib.py; \
elif [ -f un.go ]; then \
go run un.go test/fib.py; \
else \
echo "Go client not found"; \
exit 1; \
fi
test-javascript:
@echo "Testing JavaScript client (clients/javascript/un.js)..."
@if [ -f clients/javascript/un.js ]; then \
node clients/javascript/un.js test/fib.py && \
[ -f tests/test_un_js.js ] && node tests/test_un_js.js || true; \
elif [ -f un.js ]; then \
node un.js test/fib.py && \
[ -f tests/test_un_js.js ] && node tests/test_un_js.js || true; \
else \
echo "JavaScript client not found"; \
exit 1; \
fi
test-ruby:
@echo "Testing Ruby client (clients/ruby/un.rb)..."
@if [ -f clients/ruby/un.rb ]; then \
ruby -w clients/ruby/un.rb test/fib.py && \
[ -f tests/test_un_rb.rb ] && ruby tests/test_un_rb.rb || true; \
elif [ -f un.rb ]; then \
ruby -w un.rb test/fib.py; \
else \
echo "Ruby client not found"; \
exit 1; \
fi
test-php:
@echo "Testing PHP client (clients/php/un.php)..."
@if [ -f clients/php/un.php ]; then \
php -l clients/php/un.php && \
php clients/php/un.php test/fib.py; \
elif [ -f un.php ]; then \
php -l un.php && \
php un.php test/fib.py; \
else \
echo "PHP client not found"; \
exit 1; \
fi
test-rust:
@echo "Testing Rust client (clients/rust/un.rs)..."
@if [ -d clients/rust ]; then \
cd clients/rust && \
cargo test --release && \
cargo run --release -- ../../test/fib.py; \
elif [ -f un.rs ]; then \
rustc un.rs -o un && \
./un test/fib.py; \
else \
echo "Rust client not found"; \
exit 1; \
fi
test-java:
@echo "Testing Java client (clients/java/Un.java)..."
@if [ -f clients/java/Un.java ]; then \
cd clients/java && \
javac Un.java && \
java -cp . Un ../../test/fib.py; \
elif [ -f Un.java ]; then \
javac Un.java && \
java -cp . Un test/fib.py; \
else \
echo "Java client not found"; \
exit 1; \
fi
test-bash:
@echo "Testing Bash client (clients/bash/un.sh)..."
@if [ -f clients/bash/un.sh ]; then \
bash -n clients/bash/un.sh && \
bash clients/bash/un.sh test/fib.py; \
elif [ -f un.sh ]; then \
bash -n un.sh && \
bash un.sh test/fib.py; \
else \
echo "Bash client not found"; \
exit 1; \
fi
test-perl:
@echo "Testing Perl client (clients/perl/un.pl)..."
@if [ -f clients/perl/un.pl ]; then \
perl -c clients/perl/un.pl && \
perl clients/perl/un.pl test/fib.py; \
elif [ -f un.pl ]; then \
perl -c un.pl && \
perl un.pl test/fib.py; \
else \
echo "Perl client not found"; \
exit 1; \
fi
test-lua:
@echo "Testing Lua client (clients/lua/un.lua)..."
@if [ -f clients/lua/un.lua ]; then \
lua clients/lua/un.lua test/fib.py; \
elif [ -f un.lua ]; then \
lua un.lua test/fib.py; \
else \
echo "Lua client not found"; \
exit 1; \
fi
test-integration:
@echo "Testing all clients against API..."
@if [ -f tests/integration-all-clients.sh ]; then \
bash tests/integration-all-clients.sh; \
else \
echo "Integration test script not found"; \
exit 1; \
fi
test-parity:
@echo "Testing feature parity across all clients..."
@if [ -f tests/feature-parity-matrix.sh ]; then \
bash tests/feature-parity-matrix.sh; \
else \
echo "Feature parity test script not found"; \
exit 1; \
fi
test-ci-locally:
@echo "Running CI pipeline locally (detection + build + test)..."
@bash scripts/detect-changes.sh > changes.json
@echo "Changes detected:"
@cat changes.json
@bash scripts/generate-matrix.sh > test-matrix.yml
@echo "Test matrix generated:"
@cat test-matrix.yml
@bash scripts/build-clients.sh || true
@echo "Ready to run tests from test-matrix.yml"
.PHONY: lint
lint:
@echo "Linting all clients (where applicable)..."
@command -v shellcheck >/dev/null 2>&1 && bash -n un.sh && shellcheck un.sh || echo "Skipping shellcheck"
@command -v python3 >/dev/null 2>&1 && python3 -m pylint un.py 2>/dev/null || echo "Skipping pylint"
@command -v eslint >/dev/null 2>&1 && npx eslint un.js 2>/dev/null || echo "Skipping eslint"
@command -v rubocop >/dev/null 2>&1 && rubocop un.rb 2>/dev/null || echo "Skipping rubocop"
@echo "Linting complete"
.PHONY: clean
clean:
@echo "Cleaning build artifacts..."
@rm -rf build/ bin/ dist/ *.o un_*
@find . -name "*.pyc" -delete
@find . -name "__pycache__" -type d -delete
@echo "Clean complete"