name: Node.js Test on: [push] jobs: nodejs-test: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: '20' # or '18' if you need older cache: 'npm' - name: Verify Node & npm run: | node -v npm -v - name: Detect & install deps (lockfile-aware) + run tests shell: bash run: | set -euo pipefail if [ -f package.json ]; then echo "package.json found." if [ -f package-lock.json ]; then echo "Using npm ci (lockfile present)." npm ci else echo "No lockfile; using npm install." npm install fi # Run tests only if there's a real test script (not the default placeholder) if node -e "const p=require('./package.json'); const s=p.scripts&&p.scripts.test; process.exit(!(s && !/no test specified/.test(String(s))))"; then npm test else echo "No meaningful test script found; skipping tests." fi else echo "No Node project detected. Creating a tiny smoke-test project..." npm init -y >/dev/null 2>&1 npm install --save-dev mocha >/dev/null 2>&1 npm pkg set scripts.test="mocha" >/dev/null 2>&1 # Write minimal app and test (note: heredoc terminators aligned under run: |) cat > sum.js <<'EOF' function add(a, b) { return a + b; } module.exports = { add }; EOF mkdir -p test cat > test/sum.test.js <<'EOF' const assert = require('assert'); const { add } = require('../sum'); describe('add', () => { it('adds numbers', () => { assert.strictEqual(add(2, 2), 4); }); }); EOF npm test fi