181 lines
6.7 KiB
YAML
181 lines
6.7 KiB
YAML
# Gitea Actions – Server Tests
|
||
#
|
||
# Two jobs run on every push to any branch:
|
||
# 1. jest-integration – Jest integration tests using an in-memory MongoDB
|
||
# instance (mongodb-memory-server). No external database
|
||
# or repository secrets are required.
|
||
# 2. mocha-unit – Existing Mocha/Chai unit tests in tests/ and tests/utils/
|
||
#
|
||
# Optional repository secret:
|
||
# TOKEN_SECRET – JWT secret used by the server's auth helpers.
|
||
# A safe default is used automatically when absent.
|
||
|
||
name: Server Tests
|
||
|
||
on:
|
||
push:
|
||
branches:
|
||
- '**'
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
|
||
jobs:
|
||
# ══════════════════════════════════════════════════════════════════════════
|
||
# Job 1: Jest integration tests (in-memory MongoDB via mongodb-memory-server)
|
||
# ══════════════════════════════════════════════════════════════════════════
|
||
jest-integration:
|
||
name: Jest – Integration Tests
|
||
runs-on: self-hosted
|
||
|
||
defaults:
|
||
run:
|
||
working-directory: Development/server
|
||
|
||
steps:
|
||
- name: Checkout repository
|
||
uses: actions/checkout@v4
|
||
|
||
- name: Set up Node.js
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '18'
|
||
cache: 'npm'
|
||
cache-dependency-path: Development/server/package-lock.json
|
||
|
||
- name: Prepare MongoDB runtime compatibility libraries
|
||
run: |
|
||
set -e
|
||
|
||
if command -v ldconfig >/dev/null 2>&1 && ldconfig -p | grep -q 'libcrypto.so.1.1'; then
|
||
echo "OpenSSL 1.1 compatibility already present"
|
||
exit 0
|
||
fi
|
||
|
||
LIBSSL_DIR="${RUNNER_TEMP:-/tmp}/libssl11"
|
||
DEB_PATH="${RUNNER_TEMP:-/tmp}/libssl1.1.deb"
|
||
mkdir -p "$LIBSSL_DIR"
|
||
|
||
if [ ! -f "$DEB_PATH" ]; then
|
||
curl -fsSL \
|
||
-o "$DEB_PATH" \
|
||
"http://security.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.24_amd64.deb"
|
||
fi
|
||
|
||
dpkg-deb -x "$DEB_PATH" "$LIBSSL_DIR"
|
||
|
||
LIB_DIR="$LIBSSL_DIR/usr/lib/x86_64-linux-gnu"
|
||
if [ ! -f "$LIB_DIR/libcrypto.so.1.1" ]; then
|
||
echo "libcrypto.so.1.1 was not found after extracting $DEB_PATH"
|
||
exit 1
|
||
fi
|
||
|
||
echo "LD_LIBRARY_PATH=$LIB_DIR${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" >> "$GITHUB_ENV"
|
||
echo "Prepared OpenSSL 1.1 compatibility libraries in $LIB_DIR"
|
||
|
||
- name: Install dependencies
|
||
env:
|
||
NPM_CONFIG_CACHE: /tmp/npm-cache
|
||
run: npm ci --prefer-offline
|
||
|
||
- name: Write test environment file
|
||
run: |
|
||
cat > environment.test.env <<'EOF'
|
||
NODE_ENV=test
|
||
TOKEN_SECRET=${{ secrets.TOKEN_SECRET || 'ci-test-secret-not-for-production' }}
|
||
PRODUCTION=false
|
||
NO_EMAIL_MODE=true
|
||
ENABLE_SUBSCRIPTION=false
|
||
INV_IMG_VIR_DIR=/tmp/inv-img
|
||
INV_UPLOAD_DIR=/tmp/inv-upload
|
||
INV_MAX_UPLOAD_SIZE_MB=5
|
||
PAGINATION_DEFAULT_LIMIT=1000
|
||
PAGINATION_MAX_LIMIT=14000
|
||
STRIPE_SEC_KEY=sk_test_placeholder
|
||
STRIPE_API_VERSION=2022-11-15
|
||
EOF
|
||
|
||
- name: Enforce controller integration contract
|
||
env:
|
||
TEST_ENV_FILE: ./environment.test.env
|
||
NODE_ENV: test
|
||
MONGOMS_VERSION: 4.4.28
|
||
run: npm run test:integration:contract
|
||
|
||
- name: Run Jest integration tests
|
||
env:
|
||
TEST_ENV_FILE: ./environment.test.env
|
||
NODE_ENV: test
|
||
MONGOMS_VERSION: 4.4.28
|
||
run: npm run test:integration:jest -- --ci
|
||
|
||
- name: Upload Jest results
|
||
if: always()
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: jest-integration-results
|
||
# ══════════════════════════════════════════════════════════════════════════
|
||
# Job 2: Mocha/Chai tests – tests/ and tests/utils/
|
||
# These tests are self-contained unit tests that do not require MongoDB.
|
||
# ══════════════════════════════════════════════════════════════════════════
|
||
mocha-unit:
|
||
name: Mocha – Unit & Utility Tests
|
||
runs-on: self-hosted
|
||
|
||
defaults:
|
||
run:
|
||
working-directory: Development/server
|
||
|
||
steps:
|
||
- name: Checkout repository
|
||
uses: actions/checkout@v4
|
||
|
||
- name: Set up Node.js
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '18'
|
||
|
||
# Redirect the npm cache away from /root/.npm (root-owned on this runner)
|
||
# to a writable temp directory. Also clears any stale node_modules left
|
||
# by a previous run that the root-owned cache could not clean up.
|
||
- name: Fix npm cache permissions
|
||
run: |
|
||
mkdir -p /tmp/npm-cache
|
||
rm -rf node_modules || true
|
||
|
||
- name: Install dependencies
|
||
env:
|
||
NPM_CONFIG_CACHE: /tmp/npm-cache
|
||
run: npm ci
|
||
|
||
# Write a minimal env file so dotenv does not error on startup.
|
||
# These tests do not hit the database; DB_* values are placeholders.
|
||
- name: Write test environment file
|
||
run: |
|
||
cat > environment.env <<'EOF'
|
||
NODE_ENV=test
|
||
DB_HOSTS=127.0.0.1:27017
|
||
DB_NAME=agmission_test
|
||
DB_USR=
|
||
DB_PWD=
|
||
TOKEN_SECRET=${{ secrets.TOKEN_SECRET || 'ci-test-secret-not-for-production' }}
|
||
PRODUCTION=false
|
||
NO_EMAIL_MODE=true
|
||
ENABLE_SUBSCRIPTION=false
|
||
STRIPE_SEC_KEY=sk_test_placeholder
|
||
STRIPE_API_VERSION=2022-11-15
|
||
EOF
|
||
|
||
# Run all top-level test_*.js files (skips integration/ and satloc/ sub-dirs
|
||
# which are covered by the jest-integration job or need live connections).
|
||
- name: Run Mocha unit tests (tests/)
|
||
run: |
|
||
npx mocha --exit --timeout 120000 \
|
||
--require tests/setup.js \
|
||
'tests/test_*.js'
|
||
continue-on-error: false
|
||
|
||
# Run Mocha tests in tests/utils/
|
||
- name: Run Mocha utility tests (tests/utils/)
|
||
run: npm run test:utils
|
||
continue-on-error: false
|