Building & Testing the Git Init Script: Headless, Interactive, Scaffolding
The Challenge: Safe automation without surprises
You have a powerful repository initializer — scripts/git_init.sh — that supports interactive prompts and programmatic --headless invocations. This quest will guide you through validating the script’s behavior, adding tests, and ensuring it behaves well in CI.
Why this matters:
- Scripts are often used in automation and CI; they must behave predictably and be testable.
- Headless behavior must be non-destructive and reliable; interactive commands can’t be used in CI loops.
- Creating files via programmatic scaffolding must be done with a clear contract and test coverage.
Objectives
- Verify script syntax with
bash -nand lint withshellcheck. - Add Bats tests to confirm
--headlessoperations do not push. - Ensure easy to run
--no-pushfor local tests. - Add CI step instructions for running tests.
Tests and Tools
We suggest two layers of tests:
- Unit-ish validations using local filesystem checks via
bats. - Linting static validation with
shellcheck.
Example Bats Test (save in tests/bats/test_headless.bats)
#!/usr/bin/env bats
setup() {
TMPDIR=$(mktemp -d)
cd "$TMPDIR"
}
teardown() {
rm -rf "$TMPDIR"
}
@test "headless mode creates a repo and does not push" {
run bash /path/to/scripts/git_init.sh --headless -n sample-test --no-push
[ "$status" -eq 0 ]
[ -d "$HOME/github/sample-test/.git" ]
}
ShellCheck linting
Install with brew install shellcheck on macOS and run shellcheck scripts/git_init.sh.
Syntax check
Use bash -n scripts/git_init.sh to detect syntax issues early.
Try it locally
- Syntax check
bash -n scripts/git_init.sh
- Run headless mode locally without pushing
bash scripts/git_init.sh --headless -n test-quest-sample --no-push --gitignore python,macos --scaffold python
- Run Bats tests
# install bats-core
brew install bats-core
bats tests/bats
- Run ShellCheck
brew install shellcheck
shellcheck scripts/git_init.sh
Acceptance Criteria
bash -nreturns no errorshellcheckreturns no major errorsbats tests/bats/test_headless.batsreturns pass for headless creation--gitignorecreates a.gitignorefile when requested--scaffold pythoncreatessrcandtests--dry-runprints operations and does not create files or push
Next Steps (Optional)
- Try
--dry-runto preview changes without applying them. - Create a GitHub Actions job that installs bats and shellcheck and runs tests on PRs.
Complete this quest to prove you can safely add features to a script and make it testable in automation.
Good luck! 🛠️